收到TCP RST数据包后,主机是否会丢弃接收缓冲区中已被远程主机确认但未被应用程序进程使用套接字读取的所有剩余数据?
我想知道,一旦我对其他主机不再感兴趣(例如保存资源)不感兴趣,关闭套接字是否危险;例如如果这可能导致另一方丢失我已经发送的任何数据,但他还没有阅读。
是否应该避免使用RST并指示完全的双向通信失败,或者它们是一种相对安全的单向强制连接拆除方式,如上例所示?
答案 0 :(得分:1)
我找到了一些关于这个主题的好解释,它们表明在这种情况下数据丢失是非常可能的: 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。
答案 1 :(得分:1)
套接字上的应用程序级close(2)
不会生成RST
,而是发送到另一方的FIN
数据包,这会导致正常的四向连接拆除。 RST
由网络堆栈生成,以响应针对不存在的TCP连接的数据包。
另一方面,如果您关闭套接字但另一边仍有一些要写入的数据,则下一个send(2)
将导致EPIPE
。
考虑到上述所有因素,您最好在TCP之上设计自己的协议,包括显式的“注销”或“断开连接”消息。