三次握手四次挥手

TCP 三次握手 & 四次挥手(极简核心版)

TCP 是面向连接、可靠的传输协议,建立连接用三次握手,断开连接用四次挥手,核心是确认双方发送、接收能力都正常,并同步序列号。


一、三次握手(建立连接)

角色:客户端(主动发起)、服务端(被动监听)
核心标志位SYN(同步)、ACK(确认)

握手流程

  1. 第一次握手(客户端→服务端)
    客户端发送 SYN 包(SYN=1,携带初始序列号 seq=x),进入 SYN_SENT 状态,请求建立连接

  2. 第二次握手(服务端→客户端)
    服务端收到后,回复 SYN+ACK 包(SYN=1, ACK=1ack=x+1 确认客户端,自身序列号 seq=y),进入 SYN_RCVD 状态,同意连接并同步自己的序列号

  3. 第三次握手(客户端→服务端)
    客户端收到后,回复 ACK 包(ACK=1ack=y+1 确认服务端,序列号 seq=x+1),双方均进入 ESTABLISHED(已连接)状态,连接正式建立

为什么必须三次?

  • 两次握手:无法确认客户端的接收能力、服务端的发送能力,可能导致无效连接、资源浪费。
  • 三次握手:双向确认收发能力正常,是最小可靠次数。

二、四次挥手(断开连接)

特点:TCP 是全双工通信,双方需分别关闭各自的发送通道,因此多一步。
核心标志位FIN(结束)、ACK(确认)

挥手流程(以客户端主动关闭为例)

  1. 第一次挥手(客户端→服务端)
    客户端发送 FIN 包(FIN=1seq=u),进入 FIN_WAIT_1 状态,本方不再发送数据

  2. 第二次挥手(服务端→客户端)
    服务端收到后,回复 ACK 包(ACK=1ack=u+1seq=v),进入 CLOSE_WAIT 状态。
    客户端收到后进入 FIN_WAIT_2此时服务端仍可向客户端发剩余数据

  3. 第三次挥手(服务端→客户端)
    服务端数据发送完毕,主动发送 FIN 包(FIN=1, ACK=1ack=u+1seq=w),进入 LAST_ACK 状态,本方也停止发送

  4. 第四次挥手(客户端→服务端)
    客户端收到后,回复 ACK 包(ACK=1ack=w+1seq=u+1),进入 TIME_WAIT 状态(等待 2MSL,确保服务端收到确认);
    服务端收到 ACK 后直接关闭(CLOSED),客户端等待超时后也关闭。

为什么是四次?

  • 关闭时,被动方需先回复 ACK 告知收到关闭请求,再等自身数据发完后单独发 FIN,两个步骤无法合并,因此比握手多一次。

核心总结

  • 三次握手:建立连接,双向确认收发能力,同步序列号。
  • 四次挥手:断开连接,全双工通道分两次关闭,保证数据传输完整。
  • TIME_WAIT 作用:防止最后一个 ACK 丢失,避免旧连接报文干扰新连接。

需要我用通俗比喻(比如打电话)再讲一遍,方便记忆吗?

posted @ 2026-02-09 14:22  wuyingchun1987  阅读(1)  评论(0)    收藏  举报