Время соединения вне записи TCP (netstat показывает ESTABLISHED) - PullRequest
3 голосов
/ 24 октября 2011

Я провел эксперимент:
Сервер прослушивает порт 8804, принимает подключение клиента и затем отправляет данные клиенту бесконечно.Я отключил сеть.

  1. Когда я запускаю netstat -anotp |grep 8804, он показывает, что соединение «УСТАНОВЛЕНО» как на сервере, так и на клиенте, но передача данных отсутствует.
  2. Через некоторое время сервер выдает ошибку: «Время ожидания истекло»
  3. netstat -anotp |grep 8804 и обнаружил, что клиент все еще «УСТАНОВЛЕН»

Итак:
1. Почему сервер, заблокированный системным вызовом «write», выдает ошибку «Timeout Connection Connection».Почему не клиент?
2. Как позволить клиенту обнаружить, что соединение фактически отключено.
3. Почему статусы сервера и клиента «УСТАНОВЛЕНЫ», когда сеть не работает?

Спасибо за Ваш ответ !

1 Ответ

6 голосов
/ 24 октября 2011
  1. Ваш сервер ожидает TCP ACK для отдельных сегментов данных, которые он отправляет клиенту;однако клиент не знает, как долго хранятся данные сервера.Поскольку вы закрываете сеть, сервер больше не получает ACK от клиента.Результат: Тайм-аут соединения на сервере (см. Примечание 1)
  2. Использование TCP Keepalive на вашем сокете (см. Примечание 2)
  3. Вы не включили TCP Keepalive.Если вы используете python, вы можете сделать это следующим образом (при условии, что ваш сокет имеет имя s):
# Do this before you accept() anything on the socket
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

EDIT:
Поскольку вы используете C, ссылка на Linux TCP Keepalive Howto

ПРИМЕЧАНИЯ
1. RFC 1122: раздел 4.2.3.5 «Сбои TCP-соединения»
2. RFC 1122: раздел 4.2.3.6 «Keepalive TCP»

...