结合Packet Tracer理解TCP连接释放
通过Packet Tracer抓包画出的TCP连接释放示意图跟谢希仁老师的《计算机网络 第七版》不一致,本文给出解释。
1. TCP连接释放
TCP是全双工通信,释放连接需要两个方向都释放。TCP连接释放过程示意图如下(图片来源于谢希仁老师《计算机网络 第七版》):
图1 TCP连接释放过程
图中上方两条线展示的是A-->B
的连接释放,下方两条线是B-->A
的连接释放。
2. 在Packet Tracer验证
使用Cisco Packet Tracer创建一个简单的网络拓扑结构PC -- Server
,通过PC向Server发送HTTP请求,抓到如下数据包。
图2 Cisco Packet Tracer抓取TCP报文
细心的你可能会发现,图中第一条线请求释放连接怎么会有ACK=1
。这是因为ACK=1
并不等于报文是响应报文,事实上ACK
在图中只是标记位,而标记位ACK
连接建立就一直被设置,因为只有ACK=1
时确认号字段才有效。RFC: 793说得很清楚:
Acknowledgment Number: 32 bits
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.
分析上图后面抓到的TCP报文,可以画出如下TCP连接释放过程示意图,如下:
图3 TCP连接释放过程实例
对比图1,图3少了一条线。这是因为,在本例中,把第二步和第三步合并了。如下:
Client ------FIN-----> Server
Client <-----ACK------ Server
Client <-----FIN------ Server
Client ------ACK-----> Server
将第二步和第三步合并,即服务端向客户端发送确认报文(ACK)和发起断开连接请求(FIN)放在同一个报文中。也可以理解成报文3捎带(piggyback)了报文2。
Client ------FIN-----> Server
Client <---ACK/FIN---- Server
Client ------ACK-----> Server
这样,图1和图3就统一起来了。另,图3有一个小细节,第一条线的确认号ack
为472
,第三条线的ack
也是472
。这是因为确认报文,没有携带数据,可以不消耗序号。
参考资料: