关于TCP三次握手和四次挥手的疑点
参考文章:浅谈TCP三次握手和四次挥手
1、三次握手的作用
(1)确保双方收到对方的初始序列号:客户端发送SYN包,服务器回复SYN-ACK包,客户端再回复ACK包,确保双方都接收到对方的序列号。
(2)防止重复的连接初始化:如果网络中存在旧的连接请求包,三次握手可以确保不会因为这些旧包而错误地建立连接。
(3)同步序列号:在建立连接时,双方需要同步各自的序列号,以确保后续数据传输的顺序和完整性。
2、为什么能防止重复连接初始化?
客户端发送的旧SYN报文如果比新报文先到达服务端,服务端会回复SYN+ACK,但客户端发现确认号不对,就会发送RST终止连接。这样旧的连接请求就不会建立,而新的SYN之后到达时就能正常建立连接。
通过返回的确认ACK信息中的序列号,判断是否是当前连接的请求,从而即时发送RTS报文终止连接,避免服务器为连接分配资源造成浪费;
3、为什么要四次挥手?
四次挥手的主要目的是为了确保双方都已经完全准备好关闭连接,避免数据丢失或中断。具体原因如下:
双向关闭:TCP连接是全双工的,需要双方分别关闭发送和接收信道。四次挥手确保双方都确认了关闭操作。
数据传输完毕:通过FIN和ACK的交换,确保所有数据都已传输和接收完毕,没有遗漏。
避免资源浪费:确保双方的连接资源都已释放,防止因未完全关闭连接而造成资源浪费。
备注:为什么是四次挥手不是三次挥手,因为TCP连接是全双工,任何一端都是具有发送和接受功能的,如果是三次,也就是在第二次服务端回复ACK信息时,加上Fin终结发送指令,有可能服务端此时还没有数据还没有传输处理完成,需要等待传输完成后,再发送Fin终结指令,所以将三次拆成四次;
4、为什么TIME_WAIT要等待2MSL?
在挥手过程中,客户端在发送最后一个ACK包后会进入一个称为TIME_WAIT状态,持续2MSL(Maximum Segment Lifetime,最大报文段生存时间)。主要原因如下:
确保最后的ACK包被接收:如果服务器没有收到最后的ACK包,会重发FIN包。客户端处于TIME_WAIT状态可以确保它有足够的时间接收和处理重发的FIN包,再次发送ACK包。
防止旧连接数据混淆:2MSL的等待时间确保了连接的旧数据包在网络中消失,避免新连接中出现旧连接的数据包混淆。
备注:为什么是2MSL,客户端发送ACK到服务端需要1MSL,服务端到客户端重发FIN需要1MSL,2MSL是客户端能接受到服务端重发的FIN的最小时间段;
并且这个时间段,防止旧连接的报文干扰新连接的收发,防止在新连接的时候误识别为需要关闭,等待旧连接的报文在网络中消失;