TCP三次握手四次挥手

1. 三次握手

2. 四次挥手

3. 全连接队列 半连接队列

答:

1. 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包

主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备

过程如下:

上述每一次握手的作用如下:

通过三次握手,就能确定双方的接收和发送能力是正常的。之后就可以正常通信了

2. 四次挥手

四次挥手原因

服务端在收到客户端断开连接Fin报文后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN报文断开连接,因此需要四次挥手

四次挥手过程

  1. 在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client(第二步);

第三步的时候server收到client的ack,如果这时全连接队列没满,那么从半连接队列拿出相关信息放入到全连接队列中,否则按tcp_abort_on_overflow指示的执行。

这时如果全连接队列满了并且tcp_abort_on_overflow是0的话,server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步),如果client超时等待比较短,就很容易异常了。

补充

补充:TCP 三次握手是为了「同步双方序列号 + 确认收发能力」,四次挥手是因为 TCP 是全双工协议,需要分别关闭两个方向的数据通道。

三次握手要点:

  • SYN:客户端发送初始序列号 seq=x,进入 SYN_SENT。
  • SYN+ACK:服务端回复 seq=y, ack=x+1,进入 SYN_RCVD。
  • ACK:客户端再发 seq=x+1, ack=y+1,双方进入 ESTABLISHED。
  • 主要作用:避免历史连接(双方对比初始序号)、协商初始序列号、确认收发能力正常。

四次挥手要点:

  • 主动方发送 FIN,进入 FIN_WAIT_1。
  • 被动方回 ACK,进入 CLOSE_WAIT;主动方进入 FIN_WAIT_2。
  • 被动方发完数据后发 FIN,进入 LAST_ACK。
  • 主动方回 ACK,进入 TIME_WAIT,等待 2MSL 后才真正关闭。
  • TIME_WAIT 主要是为了让「对端收到最后一个 ACK」并避免旧报文干扰新连接。

补充:可以用 ss -tan / netstat -an / Wireshark 抓包直观观察三次握手和四次挥手的状态变化。