发送端和接收端的TCP会话维护了32位的序列号( sequence number ),用来记录发送了多少数据,而 TCP报文确认序号(acknowledgement number) 表示了有多少数据成功接收了。通常初始的序列号是随机的,可能的范围在 0 到4,294,967,295。wireshark中默认采用了相对序号,为了便于分析,通过之前的文章Wireshark网络分析(二)-- 使用技巧设置为原始的序号。
TCP的可靠性借助了报文ack确认机制,基本逻辑为:
发送端发送了报文,包含了序号seq和长度len;
接收端收到报文之后,发送ack报文,ack=seq+len,表示下一个期望收到的报文序号。(因为从序号seq开始长度为len的数据都收到了)。
然后各种机制、优化都是围绕上述过程进行,比如:
发送端发送报文之后,等待接收ack的时间如何设定,如果长时间没有收到确认如何处理;
如果发送端过程中,网络不稳定部分“很长”时间没有到达接收端,发送端又发送了报文,接收端收到了重复的报文如何处理;
如果ack报文丢失了如何处理。
本文先对于TCP报文的seq序号和ack确认的基本过程进行分析说明。