是什么导致 TCP/IP 复位(RST)标志被发送?

我试图弄清楚为什么我的应用程序的 TCP/IP 连接每10分钟(确切地说,在1-2秒内)就会出现问题。我运行 WireShark10分钟后发现另一端正在发送一个设置了重置(RST)标志的数据包。一个谷歌搜索告诉我“重置标志意味着接收者已经变得混乱,所以想要中止连接”,但这是一个有点短的细节,我需要的。是什么引起的?有没有可能是沿途的某个路由器造成了这种情况,或者这种情况总是来自另一个端点?

编辑: 在我的计算机和另一端点之间有一个路由器(特别是 Linksys WRT-54G)——我应该在路由器设置中寻找什么?

644360 次浏览

如果连接空闲了 x 分钟,有些防火墙就会这样做。一些互联网服务供应商也出于各种原因设置了他们的路由器。

在这个时代,你需要优雅地处理(根据需要重新建立)这种情况。

一个“路由器”可以做任何事情-特别是 NAT,这可能涉及到任何数量的错误-混乱的交通..。

设备发送 RST 的一个原因是为了响应接收一个封闭套接字的数据包。

很难给出一个明确而又笼统的答案,因为自从 TCP 诞生以来,每一种可能的变态都在 TCP 上被访问过,而且各种各样的人可能正在插入 RST 以阻止流量。(例如,一些“国家防火墙”就是这样工作的。)

在对等端也运行一个数据包嗅探器(例如 Wireshark) ,看看是对等端发送 RST 还是中间的某个人。

如果有一个路由器做 NAT,特别是一个低端路由器与很少的资源,它将年龄最老的 TCP 会话第一。为此,它在数据包中设置 RST标志,有效地告诉接收站(非常不雅地)关闭连接。这样做是为了节省资源。

RST 是由做活动关闭的一方发送的,因为它是发送最后一个 ACK 的一方。因此,如果它从处于错误状态的被动关闭一侧接收到 FIN,它就会发送一个 RST 数据包,指示另一侧发生了错误。

我花了很多时间来解决这个问题,但是没有一个解决方案是有效的。 原来,我们的系统管理员错误地将相同的静态 IP 分配给两个不相关的服务器,这两个服务器属于不同的组,但位于同一个网络上。最终的结果是间歇性丢失 vnc 连接,浏览器必须刷新几次才能获取网页,以及其他奇怪的东西。

需要注意的一点是,许多 Linux netfilter 防火墙配置错误。

如果你有这样的想法:

- 前 M 状态-状态相关,已建立-接受

- FORWARD-p tcp-j REJECT ——-拒绝-带 tcp-复位

然后数据包重新排序可能导致防火墙认为数据包无效,从而产生重置,这将中断其他健康的连接。

对于无线网络,重新排序尤其可能。

相反,这应该是:

- 前 M 状态-状态相关,已建立-接受

- 前进-m 状态-状态无效-j 下降

- FORWARD-p tcp-j REJECT ——-拒绝-带 tcp-复位

基本上,只要你有:

...-m 州-州相关,建立-接受

应立即采取以下措施:

...-m 状态-状态无效-j 下降

最好丢弃一个数据包,然后生成一个可能破坏 tcp 复位的协议。重置是更好的时候,他们被证明是正确的事情发送... 因为这消除了超时。但是如果它们有任何可能是无效的,那么它们就会造成这种痛苦。

这是因为网络中有另一个进程将 RST 发送到您的 TCP 连接。

通常在下面的情况下发送 RST

  • 当启用使用 SO _ LINGER 选项的套接字时,进程关闭套接字
  • 当您的进程退出而不关闭套接字时,操作系统正在进行资源清理。

在您的例子中,听起来像是一个进程正在连接您的连接(IP + 端口) ,并且在建立连接之后继续发送 RST。

在大多数应用程序中,套接字连接都有超时。如果在超时时间内客户端和服务器之间没有通信,则将根据您的观察重置连接。 一个很好的例子是 FTP 服务器,如果你连接到服务器,只是离开连接而没有浏览或下载文件,服务器将踢你关闭连接,通常允许其他人能够连接。我想这就是你与你的连接所经历的。因此,如果您从服务器应用程序获得重置,请查看服务器应用程序,并查看它是否确实在源代码中为连接设置了超时。

下面是可以发送 TCP 重置的一些情况。

  • 非存在 TCP 端点: 客户端将 SYN 发送到服务器端不存在的 TCP 端口或 IP。服务器将向客户端发送一个重置。
  • SYN 匹配现有的 TCP 端点: 客户机将 SYN 发送到现有的 TCP 端点,这意味着相同的5个元组。服务器将向客户端发送一个重置。
  • Accept Queue Full: 当服务器端的接受队列已满,并且设置了 tcp _ abort _ on _ overflow 时。服务器将向客户端发送一个重置。
  • 半开连接: 当服务器重新启动时。之前的所有连接都将从服务器端重置。
  • 防火墙: 防火墙可以向客户端或服务器发送一个重置
  • 时间等待暗杀: 当客户端处于时间等待状态时,从服务器端接收到一条消息,客户端将向服务器发送一个重置。
  • 中止连接: 当客户端中止连接时,它可以向服务器发送一个重置