Будет ли TCP RST заставлять хост отбрасывать буфер приема? - PullRequest
1 голос
/ 16 января 2012

После получения пакета TCP RST хост отбросит все оставшиеся данные в буфере приема, которые уже были подтверждены удаленным хостом, но не прочитаны процессом приложения с использованием сокета?

Мне интересно, опасно ли закрывать сокет, как только меня больше не интересует, что другой хост должен сказать (например, ресурсам консерватора); например если это может привести к потере другой стороной каких-либо данных, которые я уже отправил, но он еще не прочитал.

Следует ли вообще избегать использования RST и указывать на полный двунаправленный сбой связи или это относительно безопасный способ однонаправленного принудительного разрыва соединения, как в примере выше?

Ответы [ 2 ]

1 голос
/ 18 января 2012

Уровень приложения close(2) в сокете не создает RST, но пакет FIN отправляется на другую сторону, что приводит к обычному разрыву четырехстороннего соединения. RST генерируется сетевым стеком в ответ на пакеты, предназначенные для несуществующего TCP-соединения.

С другой стороны, если вы закроете сокет, но на другой стороне еще есть какие-то данные для записи, следующее send(2) приведет к EPIPE.

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

1 голос
/ 18 января 2012

Я нашел несколько хороших объяснений этой темы, они указывают, что в этом случае потеря данных вполне возможна: http://blog.olivierlanglois.net/index.php/2010/02/06/tcp_rst_flag_subtleties

http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable также дает дополнительную информацию по этой теме и предлагает решение, которое я использовал в своем коде. До сих пор я не видел RST, отправленных моим серверным приложением.

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