Как просмотреть / изменить время ожидания подключения к сокету в Linux?
Вопрос
При создании сокета в Java:
new Socket(host, port);
Конструктор сокета попытается подключиться к хост: порт перед возвращением.В Windows это завершается сбоем почти сразу для недоступных хостов, но для Linux может потребоваться до 5 минут для истечения времени ожидания сокета.
Я знаю, что если у меня есть контроль над созданием сокетов, я могу сделать:
Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);
но я бы предпочел, чтобы ОС использовала разумное значение по умолчанию.Есть ли способ изменить этот параметр в Linux?
Спасибо
Решение
Я думаю, ты хочешь /proc/sys/net/ipv4/tcp_syn_retries
.Значение по умолчанию обычно равно 5 или 6, что составляет около 3 минут.
Обратите внимание, что они являются общесистемными.
Другие советы
Я бы не советовал изменять настройки операционной системы, поскольку это может неожиданно повлиять на другие приложения.В Socket.setSoTimeout()
метод тоже может помочь вам.
Кстати, не совсем верно, что Linux и Windows ведут себя здесь по-разному.Помимо начальных попыток синхронизации (которые могут быть настроены в Linux и Windows), состояние соседа, а также другие маршрутизаторы, отправляющие ПЕРВЫЕ пакеты, также играют определенную роль.
Если попытка подключения в Windows немедленно завершается неудачей, вполне вероятно, что она была предпринята маршрутизатором ранее восьми раз или сосед был признан недоступным на уровне ARP.Попробуйте arp -a -v
команда в Windows для просмотра недоступных хостов, которые быстро отклоняются.
Для Linux вы бы использовали ip neigh
чтобы перечислить состояние доступности станций в вашей локальной сети.
Насколько я понимаю, это зависит от системного тайм-аута TCP / IP по умолчанию (240 секунд по умолчанию?)...один из вариантов - попробовать настроить их, однако это может повлиять на любые другие программы на том же компьютере, которые полагаются на значение тайм-аута.В этом случае, возможно, было бы безопаснее вместо этого просто снизить значение "тайм-аут" в вашем вызове Java connect().