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

3 вопроса:

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

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

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

    2 Solutions collect form web for “В чем разница между соединением и таймаутом чтения для сокетов?”

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

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

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

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

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

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


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

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

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

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

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

    Давайте будем гением компьютера.