书接上文:电脑A(192.168.11.111)启动TCP Server,端口号60000;电脑B(192.168.11.1)启动WireShark,并启动TCP Client
断开TCP连接,需要四次挥手?试验一下
在Client端把之前创建的TCP连接断开,WireShark抓到了四帧数据
第一帧由Client发送给Server,54字节
根据网络报文的格式定义,可将其划分为14 20 20=54字节
与创建连接时的握手帧相比,主要区别是标志位是0x11,表示TH_ACK和TH_FIN。序列号0xC0563477、确认号0x57B6972C,均由前文决定
第二帧,由Server发送给Client,长度60字节
那就划分为14 20 20 6=60
可以看到,这就是一个应答帧,与握手时的第三帧比较接近。不过TCP头部长度是5*4=20字节,那后面的6个字节只是以太网自动补的零。序列号为0x57B6972C,确认号为0xC0563477 1
第三帧,还是由Server发送给Client,长度60字节
还是划分为14 20 20 6=60
其方向与第二帧相同,而标志位与第一帧相同TH_ACK TH_FIN。序列号为0x57B6972C,确认号为0xC0563477 1
最后是第四帧,Client发送给Server,54字节
这还是一个应答帧,与第二帧基本相同,只是方向相反。序列号为0xC0563477 1,确认号为0x57B6972C 1
补充一下TCP连接的各种状态
- TCP_S_LISTEN,等待来自任何远程TCP和端口的连接请求
- TCP_S_SYN_SENT,在发送连接请求后等待匹配的连接请求
- TCP_S_SYN_RECEIVED,在接收和发送连接请求后等待确认连接请求确认
- TCP_S_ESTABLISHED,打开连接,接收到的数据可以传递给用户。数据传输阶段的正常状态
- TCP_S_FIN_WAIT_1,等待来自远程TCP的连接终止请求、或之前发送的连接终止请求的确认
- TCP_S_FIN_WAIT_2,正在等待来自远程TCP的连接终止请求
- TCP_S_CLOSE_WAIT,正在等待本地用户的连接终止请求
- TCP_S_LAST_ACK,等待来自远程TCP的连接终止请求确认
- TCP_S_CLOSING,等待之前发送给远程TCP的连接终止请求的确认(包括其连接终止请求的确认)
- TCP_S_TIME_WAIT,等待足够的时间以确保远程TCP收到其连接终止请求的确认
- TCP_S_CLOSED,表示完全没有连接状态
总结一下,四次挥手长这样