插座故障与EOF和连接重置之间的区别

时间:2013-04-04 16:12:38

标签: linux sockets networking

为了测试网络应用程序,我编写了一个asio端口“proxy”:它在套接字上侦听应用程序客户端活动,并将所有传入的数据包发送到应用程序服务器监听的另一个套接字,然后返回。

现在,当应用程序或服务器因各种原因断开连接时,“代理”通常会获得EOF,但有时会收到“连接重置”。

因此,问题是:套接字何时因“连接重置”错误而失败?

1 个答案:

答案 0 :(得分:6)

当本地端尝试向远端发送数据并且远程端使用设置了RST标志的数据包(而不是ACK)应答时,TCP连接被“重置”。这几乎总是发生,因为远程端不知道与远程和本地地址以及远程和本地端口号匹配的任何TCP连接。可能的原因包括:

  • 远程端已重启
  • 路径中某处的状态跟踪防火墙已重新启动/更改/添加/删除
  • 负载均衡器错误地将TCP连接定向到与其应该去的节点不同的节点。
  • 远程IP地址易手(新所有者对属于旧所有者的TCP连接一无所知)。
  • 远程端认为TCP连接已经关闭(但不知何故本地端不同意)。

请注意,如果远程端在与SYN数据包的TCP连接中应答初始(RST)数据包,则会将其视为“连接被拒绝”,而不是“通过对等方重置连接”。 / p>