在Wireshark中查看时,我经常看到TCP流以RST,ACK数据包而不是RST数据包结尾。有人知道为什么吗?

我所看到的例子: /> RST,ACK

Wireshark没有在RST,ACK数据包之前拾取RST数据包。

评论

您为什么认为在RST / ACK之前应该有一个RST段?也许您可以提供此类数据包跟踪的示例?

ACK是否在同一数据包中附带了RST?

有什么答案对您有帮助吗?如果是这样,您应该接受答案,这样问题就不会永远弹出来寻找答案。或者,您可以提供并接受自己的答案。

我确认了您发送的请求\数据结束连接结束连接= RST

#1 楼

RST / ACK不是对RST的确认,就像SYN / ACK不是对SYN的确认一样。 TCP建立实际上是一个四步过程:发起主机向接收主机发送一个SYN,接收主机为该SYN发送一个ACK。接收主机将SYN发送到发起主机,发起主机将ACK发回。这样可以建立状态通信。
为了提高效率,接收主机可以对SYN进行ACK,并在同一数据包中发送其自己的SYN,从而创建三个

SYN --> 
    <-- ACK
    <-- SYN
ACK -->


如果是RST / ACK,则设备将确认前一个数据包中发送的任何数据。带有ACK的序列,然后通知发送方该连接已通过RST关闭。该设备将两个数据包简单地组合为一个,就像SYN / ACK。在关闭TCP会话时,RST / ACK通常不是正常的响应,但也不一定表示存在问题。

评论


发送RST / ACK的示例场景是接收主机未在目标TCP端口上侦听时。

–靛蓝K
2014年9月15日上午9:12

确实是的。我曾经尝试在端口80上模拟从机器A到机器B的DDoS攻击(出于教育目的;))。但是B的80端口未打开。因此,我可以看到机器B向伪造的源地址发送了许多RST ACK响应。

–smwikipedia
2015年9月5日在9:18



RST / ACK响应能否取决于数据包内容?即服务器接收到数据包,并且由于数据包内容符合某些条件,因此会话已关闭。

–skooog
18年8月7日在14:46

#2 楼

建立连接后,所有数据包都需要设置ACK并与接收到的数据包的序列号相匹配,以实现可靠的传输/安全性。没有ACK的RST将不被接受。当一侧发送RST时,套接字立即关闭,并且接收方在收到有效的RST之后也立即关闭套接字。 TCP握手后



A ---> B Syn = x,Ack = y,len = z, ACK标志

B ---> A Syn = y,Ack = x + z,len = o,ACK标志

A ---> B Syn = x + z,Ack = y + o,len = p,ACK标志

B-> A Syn = y + o,ACK = x + z + p,len = q,RST,ACK标志

B在发送完最后一个数据包后关闭套接字,而A在接收到最后一个数据包之后关闭套接字。

(此处不考虑TCP窗口,否则可能会有更多的数据包确认前的一端)

ACK标志,确认号和确认过程相关但不相同。

根据RFC793


RFC793


确认编号:32位

If the ACK control bit is set this field contains the value of the
next sequence number the sender of the segment is expecting to
receive.  Once a connection is established this is always sent.


重置处理

在除SYN-SENT之外的所有状态,所有复位(RST)段都通过检查其SEQ字段进行验证。如果重置的序列号
在窗口中,则该重置有效。在SYN-SENT状态(接收到对初始SYN的响应
的RST)中,如果ACK字段
确认SYN,则RST是可接受的。

RST首先对其进行验证,然后更改状态。如果
接收器处于LISTEN状态,它将忽略它。如果接收器
处于SYN-RECEIVED状态并且以前处于LISTEN状态,则接收器返回LISTEN状态,否则接收器
中止连接并转到CLOSED州。如果接收器
处于任何其他状态,它将中止连接并建议用户
并进入关闭状态。