一、三次握手

第一次:SYN(同步请求)

​ · 客户端发送带有SYN标志位(SYN=1)的报文,并随机生成一个初始序列号。

​ · 告知服务器希望建立连接,并提供初始序列号用于后续数据顺序校验。

第二次:SYN-ACK(同步确认)

​ · 服务器收到SYN报文后,记录客户端的初始序列号(ISN_C),回复SYN-ACK报文(SYN=1,ACK=1)。

​ · SYN-ACK报文包含自己的初始序列号(ISN_S)和确认号(ACK=ISN_C+1).

​ · 表示已收到客户端的SYN,确认客户端的连接请求,同时声明自身的初始序列号。

第三次:ACK(最终确认)

​ · 客户端收到SYN-ACK报文后发送ACK报文(ACK=1),确认号为ISN_S+1。

​ · 客户端确认服务器的响应,双方确认连接可靠。

作用

​ · 交换初始序列号确保数据按需传输;

​ · 验证双方均具备发送与接受信息的能力,确保双向通信。

为何需要三次?

两次握手:若在第二次握手后直接分配资源,但客户端未收到SYN-ACK或未响应ACK,服务器资源会被长期占用。

四次握手:三次已经足够实现功能,第四次交互只会增加延迟。

二、四次握手

第一次:FIN

​ · 客户端发送FIN报文(FIN=1),序列号为seq=u,进入FIN_WAIT_1状态,表示不再发送数据,但可接收数据。

第二次:ACK

​ · 服务器收到FIN后,回复ACK报文(ACK=1),确认号ack=u+1,进入CLOSE_WAIT状态,此时:

​ · 客户端到服务器的连接关闭(单项关闭);

​ · 服务器可能继续发送未完成的数据。

​ · 客户端收到ACK报文后进入FIN_WAIT_2状态,等待服务器的FIN报文。

第三次:FIN

​ · 服务端处理完数据后发送FIN报文(FIN=1,ACK=1),序列号seq=v,确认号为ack=u+1,进入LAST_ACK状态,表示准备关闭连接。

第四次:ACK

​ · 客户端收到FIN后,回复ACK报文(ACK=1),确认号ack=v+1,进入TIME_WAIT状态,等待一段时间后关闭连接。

​ · 服务器收到ACK后立即关闭连接。

TIME_WAIT状态的作用

​ · 确保最后一个ACK到达被动关闭方。若ACK丢失,被动方会重传FIN,主动方需重新响应。

​ · 防止旧连接的报文干涉新连接。

为何需要四次挥手

​ TCP每个方向需独立关闭。被动方肯可能在发送ACK后仍有数据发送,因此需将ACK与FIN分开发送,导致四次交互。