TCP-соединение - отложено закрытие () и RST - PullRequest
0 голосов
/ 20 июля 2010

У меня TCP-клиент и TCP-сервер работают на RHEL 5.3 на разных машинах.

  • Я убиваю сервер, и FIN отправляется клиенту.ACK отсылается обратно операционной системой клиента немедленно.

  • Клиент обнаруживает закрытие (путем чтения (), возвращающего ноль), и закрывается только после 90 секунд.На этом этапе я проверил netstat с обеих сторон и он, как и ожидалось, (FIN_WAIT_2 на сервере и CLOSE_WAIT на клиенте).

  • Из-за клиента close () через 90 секунд, ОС клиента отправляет FIN на сервер, но в ответ мы получаем RST с сервера, а не ACK, как ожидалось.

Я также несколько раз видел, что из-за «отложенного» закрытия () ОС клиента отправляла RST вместо FIN.

Обратите внимание, что в обоих случаях нет ожидающих чтения пакетов с обеих сторон и опция SO_LINGER не активирована.

Есть идеи?

1 Ответ

3 голосов
/ 20 июля 2010

RST указывает, что некоторые «данные» были потеряны.В этом случае «данные» - это информация о том, что клиентская сторона полностью закрыла сокет - FIN от клиента не было передано приложению на стороне сервера (поскольку оно было уничтожено).

Вдругими словами, RST сообщает клиенту, что сервер никогда не видел завершение потока от клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...