摘要:TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。
它不仅确保数据的完整性,还设计了一套完整的连接管理机制:
• 三次握手(建立连接)
• 四次挥手(断开连接)
其中,四次挥手是TCP连接断开时的关键步骤,确保双方都能正确释放源,避免数据丢失或连接异常终止。
TCP是全双工通信,意味着数据可以同时在两个方向传输。因此,连接的断开不仅需要客户端通知服务器自己不再发送数据,还需要服务器通知客户端自己也不再发送数据。这就导致了四次挥手的过程,而不是简单的三次握手。
第一次挥手
客户端发送FIN(终止请求):客户端发送一个FIN(Finish)报文,表示自己不再发送数据,进入FIN-WAIT-1状态。此时,客户端仍然可以接收数据,但不会再主动发送数据。
第二次挥手
服务器回复ACK(确认):服务器收到FIN后,发送一个ACK(Acknowledgment)报文,确认收到客户端的终止请求,进入CLOSE-WAIT状态。此时,服务器仍然可以继续发送数据。
第三次挥手
服务器发送FIN(终止请求):服务器在完成数据传输后,发送FIN报文,表示自己也不再发送数据,进入LAST-ACK状态。
第四次挥手
客户端回复ACK(确认):客户端收到服务器的FIN后,发送ACK报文,确认收到服务器的终止请求,进入TIME-WAIT状态。此时,客户端会等待一段时间(通常是2MSL,即最大报文生存时间的两倍),确保服务器收到ACK后才彻底关闭连接。
其中TIME-WAIT的作用:
TIME-WAIT状态的存在是为了确保最后一个ACK能够被服务器正确接收,防止旧的TCP报文影响新的连接。通常,TIME-WAIT状态会持续2MSL(最大报文生存时间),以确保所有可能的延迟数据包都被清除。
TIME-WAIT还可以防止已失效的连接请求报文段影响新的连接。如果客户端在发送完最后一个ACK后立即释放连接,那么可能会导致服务器的FIN报文丢失,进而影响新的连接建立。
下图为完整流程的简图:
简单的来讲:基于TCP稳定的通信,在连接断开时不仅要终止数据的发送,还要确保对方的数据已经完全接收。同时TCP是全双工通信,所以每个通道都需要单独关闭,这导致请求回复的机制需要重复两遍,也就是4次是这个确认机制的最小步骤。
总的来讲,三次握手是建立可靠连接,而四次挥手则是为了保证数据传输的完整性。但是在实际的应用中如高并发服务器环境中:
TIME-WAIT状态可能会导致大量端口占用,影响服务器性能。为了解决这个问题,许多系统会采用TCP连接复用或缩短TIME-WAIT时间的方式来优化连接释放过程。
某些系统在Socket选项中也提供了SO_REUSEADDR选项,允许新的连接在TIME-WAIT状态下复用旧的端口,从而提高服务器的并发能力。
串口服务器_数传电台_4G DTU_遥控开关_LoRa/ZigBee/WiFi/蓝牙模块-成都亿佰特电子科技有限公司官网
来源:亿佰特物联网应用