TCP三次握手与四次挥手是传输控制协议(TCP)实现可靠连接建立与优雅断开的核心机制,其设计目标是确保通信双方的数据传输能力得到双向确认,并实现资源的有效管理与释放。以下是对博客内容的逻辑重组与结构化提炼。

一、TCP三次握手:建立可靠连接

三次握手的核心目的是通过三次报文交互,同步双方的初始序列号(ISN),并确认彼此的发送与接收能力,从而建立一个稳定的全双工通信连接。

1. 三次握手完整流程

  • 第一步:客户端发送SYN报文
    客户端向服务器发送一个同步报文段。该报文设置SYN标志位为1,并携带一个随机生成的初始序列号seq=x。此步骤旨在发起连接,并告知服务器客户端的初始序列号。发送后,客户端进入SYN-SENT状态。
  • 第二步:服务器发送SYN+ACK报文
    服务器收到客户端的SYN报文后,回复一个确认报文。该报文同时设置SYN和ACK标志位为1,携带服务器随机生成的初始序列号seq=y,并将确认号ack设置为x+1。此步骤既确认了客户端的连接请求,也向客户端发起同步。发送后,服务器进入SYN-RCVD状态。
  • 第三步:客户端发送ACK报文
    客户端收到服务器的SYN+ACK报文后,向服务器发送最终的确认报文。该报文设置ACK标志位为1,序列号seq设置为x+1,确认号ack设置为y+1。此步骤确认了服务器的同步请求。此后,双方均进入ESTABLISHED状态,连接建立成功,可以开始数据传输 。

2. 为什么是三次握手?
采用三次而非两次握手,主要基于两个关键考量:

  • 防止历史连接初始化造成的资源浪费:若客户端因网络延迟而重传的SYN报文先于原始延迟报文到达服务器,两次握手会导致服务器直接进入连接状态。而客户端实际期望建立的是新连接,不会响应旧连接的报文,导致服务器资源被无效占用。第三次握手使得客户端有机会对服务器的同步请求进行确认,从而避免了此类无效连接的建立。
  • 确保双向通信能力:三次握手过程明确验证了“客户端能发能收”和“服务器能发能收”这四种能力。两次握手只能保证服务器知道客户端能发、服务器能收,但无法确认客户端能收以及服务器能发,无法建立可靠的全双工信道 。

二、TCP四次挥手:断开可靠连接

四次挥手的核心目的是确保通信双方的所有数据都已传输完毕,并有序地释放连接资源,实现连接的优雅关闭。

1. 四次挥手完整流程(以客户端主动关闭为例)

  • 第一步:客户端发送FIN报文
    当客户端数据发送完毕后,向服务器发送一个结束报文。该报文设置FIN标志位为1,并携带当前序列号seq=u。此步骤表示客户端已无数据发送,请求关闭连接。发送后,客户端进入FIN-WAIT-1状态。
  • 第二步:服务器发送ACK报文
    服务器收到FIN报文后,立即回复一个确认报文。该报文设置ACK标志位为1,确认号ack=u+1,并携带服务器当前序列号seq=v。此步骤仅确认收到了客户端的关闭请求,但服务器可能仍有数据需要发送。此时,客户端进入FIN-WAIT-2状态,服务器进入CLOSE-WAIT状态。
  • 第三步:服务器发送FIN报文
    服务器完成所有剩余数据的发送后,向客户端发送自己的结束报文。该报文同时设置FIN和ACK标志位为1,序列号seq=w,确认号ack仍为u+1。此步骤表示服务器数据也已发送完毕,同意关闭连接。发送后,服务器进入LAST-ACK状态。
  • 第四步:客户端发送ACK报文
    客户端收到服务器的FIN报文后,发送最终的确认报文。该报文设置ACK标志位为1,序列号seq=u+1,确认号ack=w+1。发送后,客户端进入TIME-WAIT状态,等待2MSL(两倍的最大报文段生存时间)后关闭连接。服务器收到此ACK后,立即进入CLOSED状态 。

2. 为什么是四次挥手?
断开连接需要四次交互,其根本原因在于TCP连接的全双工特性。当一方(如客户端)发送FIN请求关闭自己到对方的发送通道后,对方(服务器)可能仍有数据需要发送,因此不能立即回复FIN关闭反向通道。服务器必须先发送一个ACK确认收到关闭请求,待自身数据发送完毕后再发送FIN请求关闭己方通道。这个过程决定了ACK和FIN无法像握手阶段那样合并发送,必须分两步进行,从而形成了四次挥手 。

3. TIME-WAIT状态的意义
客户端在发送最终ACK后进入TIME-WAIT状态并等待2MSL,其主要作用有两个:

  • 确保最后一个ACK可靠到达:若服务器未收到最终ACK,会重传FIN报文。处于TIME-WAIT状态的客户端可以再次响应,保证连接能正常关闭。
  • 允许旧连接的报文在网络中消逝:等待2MSL足以让本次连接产生的所有报文从网络中消失,避免相同四元组(源IP、源端口、目的IP、目的端口)的新连接收到旧连接的延迟报文,造成数据混淆 。

参考来源

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐