我正在接收数据包跟踪并且我的系统上的服务器收到一个RST标志,然后它回复一个数据包,ACK,RST和PSH位都被设置。这对我来说似乎不正常吗?我不确定为什么我会在RST场景中看到PSH位设置?有谁知道为什么会这样?
答案 0 :(得分:1)
建立连接后,所有数据包都需要设置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标志,确认号和确认程序是相关的,但不是一回事。
Per 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.
Reset Processing
在除SYN-SENT之外的所有状态中,通过检查其SEQ-字段来验证所有复位(RST)段。如果序列号在窗口中,则复位有效。在SYN-SENT状态(响应初始SYN而收到的RST)中,如果ACK字段确认SYN,则RST是可接受的。
RST的接收者首先验证它,然后改变状态。如果接收器处于LISTEN状态,则忽略它。如果接收器处于SYN-RECEIVED状态并且之前一直处于LISTEN状态,则接收器返回LISTEN状态,否则接收器中止连接并进入CLOSED状态。如果接收器处于任何其他状态,它将中止连接并通知用户并进入CLOSED状态。