【问题标题】:difference between socket failing with EOF and connection reset套接字因 EOF 失败和连接重置之间的区别
【发布时间】:2013-04-05 00:51:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux sockets networking


    【解决方案1】:

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

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

    请注意,如果远程端使用RST 数据包回答 TCP 连接中的初始 (SYN) 数据包,则将其视为“连接被拒绝”而不是“对等连接重置”。

    【讨论】:

    • 一些服务器还故意将RST发送给行为不端的客户端以立即断开连接,因为普通的close()首先发送所有待处理的数据在传出内核套接字缓冲区中,然后才发送FIN
    • 如果对等端在其套接字接收缓冲区中有待处理的未读数据时关闭连接,则连接也将被重置。并且重置也可能源自本地。有很多场景,而不仅仅是您在此处介绍的场景。
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-08-15
    • 2020-10-18
    • 2013-06-01
    • 2013-05-21
    相关资源
    最近更新 更多