赞
踩
在《基于Wirshark的TCP三次握手介绍》中提到,TCP在建立连接之前,要经历三次握手,而在关闭TCP连接时,通信双方要经历四次挥手,如图1所示。
图1 关闭TCP时的四次挥手
客户端和服务端进行TCP通信时,一般是客户端主动断开TCP连接。因此,第一次挥手一般是客户端向服务端发送FIN+ACK数据包,实际上就是客户端通知服务端,自己(客户端)要关闭本端的TCP连接了。图2是通过Wireshark捕获到的第一次挥手时的数据。
图2 第一次挥手
从图2中可以看到,第一次挥手数据包的TCP头部中,序列号是3423066014,确认序列号是424177797,而标志位是0x011,表示该包是FIN+ACK包。TCP头部的序列号、确认序列号与标志位的含义,请参考《基于Wirshark的TCP三次握手介绍》。
当服务端收到客户端的第一次挥手后,会向客户端发送第二次挥手数据包,即通知客户端,自己(服务端)确认了客户端关闭TCP的通知。图3是通过Wireshark捕获到的第二次挥手时的数据。
图3 第二次挥手
从图3中可以看出,有服务端向客户端发送的第二次挥手的数据包中,序列号是424177797,与第一次挥手中的确认序列号相同;第二次挥手的数据包中,确认序列号是3423066015,是第一次挥手中的序列号的值加1,因为FIN+ACK数据包占1个序列号。标志位是0x010,表示ACK数据包。
当服务端关闭本端TCP连接时,会向客户端发送FIN+ACK数据包,通知客户端,自己(服务端)要关闭本端TCP连接了。图4是通过Wireshark捕获到的第三次挥手时的数据。
图4 第三次挥手
假设在第二次挥手后,服务端没有向客户端发送数据,就直接进行了第三次挥手,因为之前服务端向客户端发送的ACK数据包不占用序列号,因此,第三次挥手的数据包中的序列号与确认序列号,与第二次挥手时相同,标志位是0x011,表示FIN+ACK数据包。
当客户端收到服务端发送的第三次挥手数据包后,会向服务端发送确认数据包,通知服务端自己(客户端)确认了服务端关闭TCP。图5是通过Wireshark捕获到的第四次挥手时的数据。
图5 第四次挥手
从图5中可以看出,第四次挥手数据包中的序列号的值是3423066015,与第三次挥手中的确认数据包值相同;第四次挥手数据包中的确认序列号的值是424177798,是第三次挥手中的数据包值加1,因为第三次挥手的数据包是FIN+ACK,占用1个序号。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。