在Wireshark中查看时,我经常看到TCP流以RST,ACK数据包而不是RST数据包结尾。有人知道为什么吗?
我看到的一个例子:
SYN SYN,ACK ...数据... RST,ACK
Wireshark不会在RST ACK数据包之前拾取RST数据包。
在Wireshark中查看时,我经常看到TCP流以RST,ACK数据包而不是RST数据包结尾。有人知道为什么吗?
我看到的一个例子:
SYN SYN,ACK ...数据... RST,ACK
Wireshark不会在RST ACK数据包之前拾取RST数据包。
Answers:
RST / ACK不是对RST的确认,就像SYN / ACK不是对SYN的确认一样。TCP建立实际上是一个四步过程:发起主机向接收主机发送SYN,接收主机为该SYN发送ACK。接收主机将SYN发送到发起主机,发起主机又发回ACK。这将建立状态通信。
SYN -->
<-- ACK
<-- SYN
ACK -->
为了提高效率,接收主机可以对SYN进行ACK,并在同一数据包中发送自己的SYN,从而创建了我们惯常看到的三向过程。
SYN -->
<-- SYN/ACK
ACK -->
对于RST / ACK,设备将使用ACK确认序列中先前数据包中发送的任何数据,然后通知发送方该连接已通过RST关闭。该设备将两个数据包简单地组合为一个,就像SYN / ACK。在关闭TCP会话时,RST / ACK通常不是正常的响应,但也不一定表示存在问题。
RST ACK
对伪造的源地址发送了很多响应。
建立连接后,所有数据包都需要设置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
确认编号: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状态。如果接收器处于任何其他状态,它将中止连接并建议用户并进入“关闭”状态。