三次握手和四次挥手小结
肯取势者可为人先,能谋势者必有所成
三次握手
1.注意状态的变化:有ClOSED、LISTEN、SYN-SEND、SYN-RECV及ESTABLISHED状态
2.存在SYN报文和ACK报文,seq的值由各端自己确认,ack的值是对方的seq+1(表示想接收到对方下一个数据的第一个字节的序号是 seq + 1)
3.三次握手的目的:建立可靠的通信信道,确认双方的收发能力都没有问题,指定自己的 初始化序列号(Init Sequense Number, ISN) 即图中的seq,为后面的可靠性传输做准备。
四次挥手
1.第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认。
2.第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
3.第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT (时间等待)状态。
为啥四次挥手客户端要保持2MSL的TIME_WAIT
1.为了确保第四次挥手的ACK能被服务器接收到,保证服务端能够正常关闭连接。
2.确保所有的老连接都在网络中消失,避免因旧数据导致的数据错乱问题。
为啥等待时间是2MSL
1.MSL,即Maximum Segment Lifetime的缩写,译为报文最大生存时间,也就是任何报文在网络上存活的最大时间,一旦超过该时间,报文就会被丢弃。2MSL也就是指的2倍MSL的时间。
2.存在以下两种情况:
- 客户端向服务端发送了ACK但服务端没有收到,服务端会超时重传FIN,那么客户端再次接到重传的FIN,会再次发送ACK(注意此时TIME_WAIT会刷新)
- 客户端向服务端发送了ACK且服务端已经收到,服务端不会在发出任何消息
两种情况都需要客户端等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:
2MSL = 去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。
参考
1.TCP第四次挥手后为什么要等待2MSL后才断开链接,为什么是2MSL:https://blog.csdn.net/qq_41878620/article/details/105628943
2.为什么TCP4次挥手时等待为2MSL:https://www.zhihu.com/question/67013338
3.关于 TCP 三次握手和四次挥手,满分回答在此:https://segmentfault.com/a/1190000039165592