三次握手四次挥手
TCP 三次握手 & 四次挥手(极简核心版)
TCP 是面向连接、可靠的传输协议,建立连接用三次握手,断开连接用四次挥手,核心是确认双方发送、接收能力都正常,并同步序列号。
一、三次握手(建立连接)
角色:客户端(主动发起)、服务端(被动监听)
核心标志位:SYN(同步)、ACK(确认)
握手流程
-
第一次握手(客户端→服务端)
客户端发送SYN包(SYN=1,携带初始序列号seq=x),进入SYN_SENT状态,请求建立连接。 -
第二次握手(服务端→客户端)
服务端收到后,回复SYN+ACK包(SYN=1, ACK=1,ack=x+1确认客户端,自身序列号seq=y),进入SYN_RCVD状态,同意连接并同步自己的序列号。 -
第三次握手(客户端→服务端)
客户端收到后,回复ACK包(ACK=1,ack=y+1确认服务端,序列号seq=x+1),双方均进入ESTABLISHED(已连接)状态,连接正式建立。
为什么必须三次?
- 两次握手:无法确认客户端的接收能力、服务端的发送能力,可能导致无效连接、资源浪费。
- 三次握手:双向确认收发能力正常,是最小可靠次数。
二、四次挥手(断开连接)
特点:TCP 是全双工通信,双方需分别关闭各自的发送通道,因此多一步。
核心标志位:FIN(结束)、ACK(确认)
挥手流程(以客户端主动关闭为例)
-
第一次挥手(客户端→服务端)
客户端发送FIN包(FIN=1,seq=u),进入FIN_WAIT_1状态,本方不再发送数据。 -
第二次挥手(服务端→客户端)
服务端收到后,回复ACK包(ACK=1,ack=u+1,seq=v),进入CLOSE_WAIT状态。
客户端收到后进入FIN_WAIT_2,此时服务端仍可向客户端发剩余数据。 -
第三次挥手(服务端→客户端)
服务端数据发送完毕,主动发送FIN包(FIN=1, ACK=1,ack=u+1,seq=w),进入LAST_ACK状态,本方也停止发送。 -
第四次挥手(客户端→服务端)
客户端收到后,回复ACK包(ACK=1,ack=w+1,seq=u+1),进入TIME_WAIT状态(等待2MSL,确保服务端收到确认);
服务端收到ACK后直接关闭(CLOSED),客户端等待超时后也关闭。
为什么是四次?
- 关闭时,被动方需先回复 ACK 告知收到关闭请求,再等自身数据发完后单独发 FIN,两个步骤无法合并,因此比握手多一次。
核心总结
- 三次握手:建立连接,双向确认收发能力,同步序列号。
- 四次挥手:断开连接,全双工通道分两次关闭,保证数据传输完整。
TIME_WAIT作用:防止最后一个ACK丢失,避免旧连接报文干扰新连接。
需要我用通俗比喻(比如打电话)再讲一遍,方便记忆吗?
浙公网安备 33010602011771号