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

3 вопроса:

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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