Как просмотреть / изменить тайм-аут подключения к сокету в Linux?

При создании сокета на Java:

new Socket(host, port);

Конструктор Socket попытается подключиться к host: port перед возвратом. В Windows это почти сразу не работает для недоступных хостов, но для Linux может потребоваться до 5 минут для тайм-аута Socket.

Я знаю, что если у меня есть контроль над созданием сокетов, я могу:

Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);

но я бы предпочел, чтобы ОС использовала разумное значение по умолчанию. Есть ли способ изменить этот параметр в Linux?

Спасибо


person Kevin    schedule 25.06.2009    source источник
comment
Я думаю, что лучше настроить этот таймаут в каждом приложении. В противном случае этот параметр повлияет на все другие приложения, работающие на этом компьютере.   -  person Reginaldo    schedule 26.06.2009
comment
Согласен, я все еще хотел бы знать, что это за настройка, если я захочу ее изменить.   -  person Kevin    schedule 26.06.2009
comment
Если вы настаиваете на изменении настроек ОС, то я думаю, что это больше не вопрос программирования и относится к ошибке сервера.   -  person akarnokd    schedule 26.06.2009


Ответы (4)


Я думаю, ты хочешь /proc/sys/net/ipv4/tcp_syn_retries. По умолчанию обычно 5 или 6, что составляет около 3 минут.

Обратите внимание, что это общесистемные.

person Duck    schedule 25.06.2009
comment
Какое время устанавливается между повторными попытками? Кажется, он экспоненциально увеличивается с каждой повторной попыткой. Где этот набор? - person Kevin; 26.06.2009
comment
Интервалы увеличиваются, по крайней мере, до определенного момента. Здесь у меня не хватает памяти. Я не помню, BSD это или TCP, и я не уверен, что Linux дает вам возможность это контролировать. - person Duck; 26.06.2009
comment
Интервалы контролируются значениями, называемыми rtoMin, rtoMax и rtoInitial, где rto означает таймаут кругового обхода. По сути, он обозначает время, которое потребуется пакету для прохождения туда и обратно. Итак, если TCP отправляет первое сообщение, он будет ждать времени rtoInitial. Если он не получает ответа, он удваивает rto (и добавляет некоторое значение джиттера), а затем повторяет попытку. Это будет продолжаться до maxRetries. Текущее значение rto никогда не превысит rtoMax. - person Aditya Sehgal; 01.07.2009
comment
@Aditya Спасибо за разъяснения. Я не мог вспомнить, вступали ли в действие алгоритмы TCP на этапе подключения или ОС устанавливала произвольные таймеры. - person Duck; 02.07.2009
comment
@Duck я установил тайм-аут подключения и тайм-аут чтения на уровне приложения для моего клиента SOAP. это работает в Windows, однако значение тайм-аута не работает в Linux. Не могли бы вы помочь мне с этим stackoverflow.com/questions/47861767/ - person Parul Chauhan; 18.12.2017

Я бы не советовал изменять настройки ОС, так как это может неожиданно повлиять на другие приложения. Метод Socket.setSoTimeout() также может вам помочь.

person akarnokd    schedule 25.06.2009
comment
Могу я спросить причину отрицательного голоса, чтобы я мог извлечь из этого урок? - person akarnokd; 26.06.2009
comment
Я думаю, что SO_TIMEOUT применяется для чтения, но не для подключения, поэтому может быть поэтому. Однако в настоящий момент я не могу найти подтверждения этому. - person Samuel Edwin Ward; 01.12.2011

Кстати, не совсем правильно, что Linux и Windows ведут себя здесь по-разному. Помимо начальных повторных попыток SYN (которые можно настроить в Linux и Windows), состояние соседа, а также другие маршрутизаторы, отправляющие пакеты RST, также играют роль.

Если попытка подключения в Windows немедленно завершается неудачей, вероятно, что маршрутизатор превысил RST или сосед был признан недоступным на уровне ARP. Попробуйте команду arp -a -v в Windows, чтобы увидеть недоступные хосты, которые быстро отклоняются.

Для Linux вы должны использовать ip neigh для отображения состояния доступности станций в вашей локальной сети.

person eckes    schedule 08.09.2011

Насколько я понимаю, это зависит от системного тайм-аута TCP / IP по умолчанию (по умолчанию 240 секунд?) ... один из вариантов - попробовать настроить их, однако это может повлиять на любые другие программы на том же компьютере, которые полагаются на значение тайм-аута. В этом случае может быть безопаснее просто уменьшить значение «тайм-аута» в вызове Java connect ().

person DreadPirateShawn    schedule 25.06.2009