Подтвердить что ты не робот

TCP Socket нет таймаута соединения

Я открываю сокет TCP и подключаю его к другому сокету в другом месте в сети. Затем я могу успешно отправлять и получать данные. У меня есть таймер, который каждую секунду отправляет что-то в сокет.

Затем я грубо прерываю соединение, принудительно теряя соединение (в этом случае вытащить кабель Ethernet). Мой сокет все еще сообщает, что он успешно записывает данные каждую секунду. Это продолжается примерно в течение 1 часа и 30 минут, когда в конечном итоге возникает ошибка записи.

Что указывает этот тайм-аут, когда сокет, наконец, принимает другой конец, исчез? Это ОС (Ubuntu 11.04), это из спецификации TCP/IP, или это параметр конфигурации сокета?

4b9b3361

Ответ 1

Вытягивание сетевого кабеля не приведет к поломке TCP-соединения (1), хотя оно нарушит связь. Вы можете снова подключить кабель и установить IP-соединение, все обратные данные будут перемещаться. Это то, что делает TCP надежным даже в сотовых сетях.

Когда TCP отправляет данные, он ожидает ответа ACK. Если ни один не приходит в течение некоторого времени, он повторно передает данные и снова ждет. Время ожидания между передачами обычно увеличивается экспоненциально.

После некоторого количества повторных передач или некоторого количества общего времени без ACK, TCP будет считать соединение "сломанным". Сколько раз или сколько времени зависит от вашей ОС и ее конфигурации, но она обычно отключается в течение нескольких минут.

Из Linux справочная страница tcp.7:

   tcp_retries2 (integer; default: 15; since Linux 2.2)
          The maximum number of times a TCP packet is retransmitted in
          established state before giving up.  The default value is 15, which
          corresponds to a duration of approximately between 13 to 30 minutes,
          depending on the retransmission timeout.  The RFC 1122 specified
          minimum limit of 100 seconds is typically deemed too short.

Вероятно, это значение, которое вы хотите настроить, чтобы изменить, сколько времени потребуется, чтобы определить, исчезло ли ваше соединение.

(1) Есть исключения из этого. Операционная система, заметив удаляемый кабель, может уведомить верхние слои о том, что все соединения должны считаться "сломанными".