TCP三次握手和四次挥手

三次握手

四次挥手

  • 三次挥手需要客户端与服务端断开连接,我这里使用vmware去连接虚拟机centos来演示。跟三次握手一样,你要抓那个网络的包,你就要在这个网络中去连接,比如我的是192.168.10.1这个,用这个通过子网分配给了一台虚拟机192.168.10.100image-20230109162807968

  • 通过xsell连接后,使用命令init 0来断开连接,这会让服务器和客户端都断开连接。分清楚我是虚拟机,服务器是虚拟适配器VMnet8,因为我是在虚拟机里主动命令断开的。抓取信息如下:(将FIN顺带的ACK忽略,就是标准的四次挥手)

    image-20230109162327318

    • 第一次为FIN标记请求,表示自己要断开连接了,不会再发送消息。image-20230109162432906

    • 第二次为ACK标记请求,表示服务器收到了,然后服务器不再接收消息,但还是会发送消息,所以这是还未发送FIN包。从这个时候我还是可以接收服务器的消息的,所以我这边还不能断开。 而有些不用接收数据就可以是三次挥手,是将ACKFIN结合一起,如上图就是,只不过是发FIN请求时带上了ACK,但第一次还是发了ACK,才不会让对方以为没收到导致重发,这样才不会对网络造成阻塞。 image-20230109162455919

    • 第三次为FIN 标记请求,这时FIN表示服务器收到我要断开连接的消息,那它也准备断开连接了,不再发送消息,那我也不必再接收了,于是我就完成挥手,原则上是可以断开了,但服务端还不知情,还是不能断开。这里要注意,其实第二次与第三次之间应该还是有很多次请求,这些请求是消息的发送和接收,不算入断开连接中的挥手,而且这些请求都跟第二次挥手以及本次挥手的Acknowledgment number相同。 image-20230109162521403

    • 第四次是ACK标记请求,就是我要告知VMnet8我已经完成挥手了,你可以断开了。VMnet8收到就可以立即断开,而我等待2MSL时间内没收到服务端重发包就可以断开。因为MSL即为包在网络中的最大生存时间,我发一次和对方未收到超时重发。image-20230109162541330