三次握手和四次挥手
Seq,Ack和Len
TCP Sequence(seq)和Acknowledgement(ack)序号用来帮助实现顺序的、可靠的TCP传输。TCP Client发送数据报文携带seq序号,表示本次会话(session)发送了多少个字节的数据,seq序号也称为“字节序”。TCP Server发送ACK报文携带ack序号,表示累积收到了ack-1个字节的数据,准备接收下一帧。
每次会话开始时,seq序号和ack序号均从0开始。
上图中,TCP Client发送的第一个数据报文携带seq为1,len为669;TCP Server的应答报文ack为670(即ack = seq + len),表示它收到了669(ack -1)个字节的报文,期望收到的下一个数据报文的seq为670。
从这个图上面看,seq序号并不是从0开始的,而是从1开始的。这是因为SYN报文和FIN报文虽然payload均为0,但是它们均会占据一个字节序(seq),如果不这样设计的话,无从判断ACK报文是否应答的SYN和FIN报文。
上图为TCP头部帧格式,其中,seq和ack均占据4个字节,取值范围0 ~ 232-1,即0~4294967295。
Wireshark异常报文分析
TCP Previous segment not captured
数据帧丢失,即收到的报文的seq大于上一个收到报文的seq+len。如果是Wireshark抓包,有可能是因为乱序导致,需要仔细甄别是因为乱序还是丢帧。
TCP Out-Of-Order
次序颠倒,数据在传输过程中顺序乱了,也就是当前报文的seq小于前一个报文的seq+len。
TCP Dup ACK xxx#y
重复应答seq=xxx的表示报文到哪个序号丢失,y表示第几次丢失。
当报文发生乱序或者丢失时,接收端会收到一些seq比期望值更大的报文。
每收到一次这种报文就ack一次期望值,用以提醒发送方。
TCP Retransmission
超时引发的数据重传。
TCP Spurious Retransmission
虚假重传,发送端认为报文已经丢失了,发起重传,尽管此时接收端已经发送了ACK应答报文。
TCP Fast Retransmission
快速重传,当发送方接收到3个或以上的[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传丢失的数据帧。
TCP Keep-Alive
保持连接特性,socket 发起方发包
TCP Keep-Alive ACK
保持连接特性,socket 应答方发包
TCP ZeroWindow
接收方接收缓冲区(接收窗口)满,停止收包
TCP Window Full
发送方发送窗口(在途发送的字节数,即接收方未应答,但是发送方已发送的字节数)满,停止发包