Linux EOF插座故障和连接重置之间的区别
为了测试一个网络应用程序,我编写了一个asio端口“代理”:它监听应用程序客户机活动的套接字,并将所有传入的数据包发送到另一个套接字,应用程序服务器在该套接字上监听数据包,然后返回 现在,当应用程序或服务器由于各种原因断开连接时,“代理”通常会收到EOF,但有时会收到“连接重置” 因此,问题是:套接字何时会因“连接重置”错误而失败?当本地端尝试向远程端发送数据,而远程端使用设置了Linux EOF插座故障和连接重置之间的区别,linux,sockets,networking,Linux,Sockets,Networking,为了测试一个网络应用程序,我编写了一个asio端口“代理”:它监听应用程序客户机活动的套接字,并将所有传入的数据包发送到另一个套接字,应用程序服务器在该套接字上监听数据包,然后返回 现在,当应用程序或服务器由于各种原因断开连接时,“代理”通常会收到EOF,但有时会收到“连接重置” 因此,问题是:套接字何时会因“连接重置”错误而失败?当本地端尝试向远程端发送数据,而远程端使用设置了RST标志(而不是ACK)的数据包进行应答时,TCP连接是“重置”的。这种情况几乎总是发生,因为远程端不知道任何与远程
RST
标志(而不是ACK
)的数据包进行应答时,TCP连接是“重置”的。这种情况几乎总是发生,因为远程端不知道任何与远程和本地地址以及远程和本地端口号匹配的TCP连接。可能的原因包括:
- 远程端已重新启动
- 路径中某处的状态跟踪防火墙已重新启动/更改/添加/删除
- 负载平衡器错误地将TCP连接定向到与其应该连接的节点不同的节点
- 远程IP地址已易手(新所有者对属于旧所有者的TCP连接一无所知)
- 远程端认为TCP连接已经关闭(但本地端不同意)
请注意,如果远程端使用
RST
数据包应答TCP连接中的初始(SYN
)数据包,则认为是“连接被拒绝”,而不是“由对等方重置连接”。一些服务器还故意将RST
发送给行为不正常的客户端,以立即断开连接,因为close()
首先发送传出内核套接字缓冲区中所有挂起的数据,然后才发送FIN
。如果对等方在其套接字接收缓冲区中有挂起的未读数据时关闭连接,则连接也将重置。而且,复位也可以在本地进行。这里有很多场景,不仅仅是您在这里介绍的场景。