结合Packet Tracer理解TCP连接释放

understand-tcp-connection-termination-with-packet-tracer

通过Packet Tracer抓包画出的TCP连接释放示意图跟谢希仁老师的《计算机网络 第七版》不一致,本文给出解释。

1. TCP连接释放

TCP是全双工通信,释放连接需要两个方向都释放。TCP连接释放过程示意图如下(图片来源于谢希仁老师《计算机网络 第七版》):

TCP连接释放过程
图1 TCP连接释放过程

图中上方两条线展示的是A-->B的连接释放,下方两条线是B-->A的连接释放。

2. 在Packet Tracer验证

使用Cisco Packet Tracer创建一个简单的网络拓扑结构PC -- Server,通过PC向Server发送HTTP请求,抓到如下数据包。

Cisco Packet Tracer抓取TCP报文
图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连接释放过程示意图,如下:

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有一个小细节,第一条线的确认号ack472,第三条线的ack也是472。这是因为确认报文,没有携带数据,可以不消耗序号。

参考资料:

[1] Not a four-way handshake in Cisco Packet Tracer?

[2] RFC: 793 TRANSMISSION CONTROL PROTOCOL

发表评论

电子邮件地址不会被公开。 必填项已用*标注