Каково различие между соединением, и считайте тайм-аут для сокетов?

3 вопроса:

  1. Каково различие между соединением, и считайте тайм-аут для сокетов?

  2. Что тайм-аут соединения устанавливает на среднюю "бесконечность"? В какой ситуации это может остаться в инфинитивном цикле? и что может инициировать это, цикл бесконечности умирает?

  3. Что тайм-аут чтения устанавливает на среднюю "бесконечность"? В какой ситуации это может остаться в инфинитивном цикле? и что может инициировать это, цикл бесконечности умирает?

161
задан James McMahon 19 August 2013 в 22:32
поделиться

2 ответа

1) В чем разница между таймаутом соединения и таймаутом чтения для сокетов?

Таймаут соединения - это таймаут установления начального соединения, т.е. завершения квитирования TCP-соединения. Таймаут чтения - это таймаут ожидания чтения данных1. В частности, если сервер не сможет отправить байт через секунд после последнего байта, будет выдана ошибка таймаута чтения.

2) Что означает таймаут соединения, установленный на "бесконечность"? В какой ситуации оно может оставаться в бесконечном цикле? и что может спровоцировать смерть бесконечного цикла?

Это означает, что попытка соединения может потенциально блокироваться вечно. Бесконечного цикла нет, но попытка соединения может быть разблокирована другим потоком, закрывающим сокет. (Вызов Thread.interrupt() также может помочь... не уверен.)

3) Что означает таймаут чтения, установленный на "бесконечность"? В какой ситуации он может оставаться в бесконечном цикле? Что может привести к завершению бесконечного цикла?

Это означает, что вызов read на потоке сокета может блокироваться вечно. И снова нет бесконечного цикла, но read может быть разблокирован вызовом Thread.interrupt(), закрытием сокета и (конечно же) отправкой данных с другого конца или закрытием соединения.


1 - Это не ... как думал один комментатор ... таймаут на то, как долго сокет может быть открыт или простаивать.

197
ответ дан 23 November 2019 в 21:27
поделиться

Это значения таймаута, навязываемые JVM для установления TCP-соединения и ожидания чтения данных из сокета.

Если значение установлено на бесконечность, вы не будете ждать вечно. Это просто означает, что у JVM нет таймаута, и за все таймауты будет отвечать ОС. Однако таймауты в ОС могут быть очень длинными. В некоторых медленных сетях я видел тайм-ауты длительностью до 6 минут.

Даже если вы установите значение тайм-аута для сокета, это может не сработать, если тайм-аут произойдет в родном коде. Мы можем воспроизвести проблему на Linux, подключившись к узлу, заблокированному брандмауэром, или отключив кабель на коммутаторе.

Единственный безопасный подход для обработки таймаута TCP - это запуск кода соединения в другом потоке и прерывание потока, когда это занимает слишком много времени.

8
ответ дан 23 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: