TCP RST会导致主机丢弃接收缓冲区吗



接收到TCP RST数据包后,主机是否会丢弃接收缓冲区中已被远程主机确认但未被使用套接字的应用程序进程读取的所有剩余数据?

我想知道,一旦我对另一个主机要说的话不感兴趣(例如,保存资源),就关闭套接字是否危险;例如,如果这可能导致对方丢失我已经发送的任何数据,但他还没有阅读。

通常应该避免RST并指示通信的完全双向故障,还是像上面的例子中那样,它们是一种相对安全的单向强制断开连接的方式?

我发现了一些关于这个主题的很好的解释,它们表明在这种情况下数据丢失是很可能的: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。

套接字上的应用程序级close(2)不会生成RST,而是生成发送到另一侧的FIN数据包,这会导致正常的四路连接断开。RST由网络堆栈响应于以不存在的TCP连接为目标的分组而生成。

另一方面,如果您关闭了套接字,但另一侧仍有一些数据要写入,那么它的下一个send(2)将导致EPIPE

考虑到以上所有内容,您最好在TCP之上设计自己的协议,其中包括明确的"注销"或"断开连接"消息。

最新更新