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

Gur*_*pof 3 sockets linux networking

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

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

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

Cel*_*ada 6

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

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

请注意,如果远程端SYN在与数据包的TCP连接中应答initial()数据RST包,则将其视为"连接被拒绝"而不是"通过对等方重置连接".

  • 一些服务器还故意将“RST”发送到行为不端的客户端以立即断开连接,因为普通的“close()”首先发送所有在传出内核套接字缓冲区中挂起的数据,然后才发送“FIN”。 (2认同)