TCP三次握手四次挥手
1. 三次握手
2. 四次挥手
3. 全连接队列 半连接队列
答:
1. 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包
主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备
过程如下:
上述每一次握手的作用如下:
通过三次握手,就能确定双方的接收和发送能力是正常的。之后就可以正常通信了
2. 四次挥手
四次挥手原因
服务端在收到客户端断开连接Fin报文后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN报文断开连接,因此需要四次挥手
四次挥手过程
- 在第一步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 抓包直观观察三次握手和四次挥手的状态变化。



