是什么导致发送TCP/IP重置(RST)标志?

Luk*_*uke 114 networking tcp

我试图找出为什么我的应用程序的TCP/IP连接每10分钟(确切地说,在1-2秒内)打嗝.我运行Wireshark并发现在10分钟不活动后,另一端正在发送一个设置了重置(RST)标志的数据包.谷歌搜索告诉我"RESET标志表示接收器已经变得混乱,因此想要中止连接"但这有点不足我需要的细节.可能是什么导致了这个?并且沿途的某个路由器是否有可能对此负责,或者这总是来自另一个端点?

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

Wil*_*ean 84

一个'路由器'可能正在做任何事情 - 特别是NAT,这可能涉及任何数量的错误缠扰交通流量......

设备发送RST的一个原因是响应于接收到关闭套接字的数据包.

很难给出一个坚定但一般性的答案,因为TCP自成立以来就已经访问过每一个可能的变态,并且各种各样的人可能会插入RST以试图阻止流量.(例如,有些'国家防火墙'就像这样工作.)

  • 路由器的TCP连接超时10分钟或路由器启用"网关智能数据包检测". (6认同)
  • 提示路由器可能存在错误,这有点丰富. (2认同)

Ale*_*der 21

在对等体上也运行数据包嗅探器(例如,Wireshark)以查看它是发送RST的对等体还是中间的某个人.


Out*_*gic 14

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

  • 你是如何解决这个问题的? (3认同)

zan*_*ngw 14

Here are some cases where a TCP reset could be sent.

  • Non-Existence TCP endpoint: The client sends SYN to a non-existing TCP port or IP on the server side. The server will send a reset to the client.
  • SYN matches the existing TCP endpoint: The client sends SYN to an existing TCP endpoint, which means the same 5-tuple. The server will send a reset to the client.
  • Accept Queue Full: When the accept queue is full on the server side, tcp_abort_on_overflow is set. The server will send a reset to the client.
  • Half-Open Connections: When the server restarts itself. Then all connections before would receive a reset from the server side.
  • Firewall: The firewall could send a reset to the client or server
  • Time-Wait Assassination: When the client in the time-wait state, receives a message from the server-side, the client will send a reset to the server.
  • Aborting Connection: When the client or server aborts the connection, it could send a reset to the server or client
  • 连接超时:如果 TCP 连接长时间处于空闲状态,其中一方可能会发送重置数据包来关闭连接。


Bri*_*uch 6

如果连接闲置了x分钟,某些防火墙会这样做。一些ISP也出于各种原因将其路由器设置为执行此操作。

在这个时代,您将需要妥善处理(根据需要重新建立)该条件。

  • 重新建立连接就好了,问题在于短暂的断开连接会不必要地引起警报。 (2认同)
  • 我什至想补充一点,从持久连接的角度来看,TCP 实际上从来都不是完全可靠的。它只是不时变得更加明显。另一个有趣的例子:有些人可能会实现逻辑,一旦检测到连接关闭或重置,就将 TCP 客户端标记为离线。有时他们懒得给客户重新连接的机会。这显然不完全正确。 (2认同)

小智 6

如果存在执行NAT的路由器,尤其是资源少的低端路由器,它将首先老化最旧的TCP会话。为此,它RST在数据包中设置标志,该标志有效地告诉接收站(非常讨厌)关闭连接。这样做是为了节省资源。


小智 6

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

  • 双方在正常关闭时发送和接收FIN。这种情况没有任何问题,因此,没有理由让一方发出重置请求。第一句话甚至没有意义。 (5认同)
  • [RST,ACK]也可以由在未监听的端口上接收SYN的一方发送。在我遇到的情况下,RST / ACK在第一个SYN之后约60秒出现。第一次世界大战 (2认同)

MaZ*_*aZe 5

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

如果你有类似的东西:

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -p tcp -j REJECT --reject-with tcp-reset

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

对于无线网络,重新排序的可能性特别大。

这应该是:

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -m state --state INVALID -j DROP

-A FORWARD -p tcp -j REJECT --reject-with tcp-reset

基本上任何时候你有:

... -m state --state RELATED,ESTABLISHED -j ACCEPT

紧随其后的是:

... -m 状态 --state 无效 -j DROP

最好丢弃一个数据包,然后生成一个潜在的协议破坏 tcp 重置。当重置被证明是正确的发送时,重置会更好......因为这消除了超时。但如果有任何机会它们是无效的,那么它们就会引起这种痛苦。