2026-10-21 11:49:08
TCP三次握手用于建立连接,确保双方收发能力正常;四次挥手用于终止连接,确保数据完整传输。 以下是具体过程及关键细节:
TCP三次握手核心目的:建立客户端与服务器之间的可靠连接,验证双方发送与接收能力是否正常。

初始状态:客户端与服务器均处于CLOSED状态。服务器主动监听端口,进入LISTEN状态;客户端发起连接请求。
步骤1:客户端发送SYN报文客户端创建传输控制块(TCB),发送SYN=1的报文,初始序列号seq=x,进入SYN-SENT状态。
关键点:SYN报文不携带数据,但消耗一个序号。
步骤2:服务器响应SYN+ACK报文服务器收到SYN后,若同意连接,发送SYN=1、ACK=1的报文,确认号ack=x+1,自身序列号seq=y,进入SYN-RCVD状态。
关键点:此报文同样不携带数据,但消耗一个序号。
步骤3:客户端确认ACK报文客户端收到后,发送ACK=1的报文,确认号ack=y+1,自身序列号seq=x+1,进入ESTABLISHED状态。服务器收到后也进入ESTABLISHED状态,连接建立。
关键点:ACK报文可携带数据,不携带时不消耗序号。
核心目的:安全终止连接,确保双方数据传输完成且无残留。

初始状态:双方均处于ESTABLISHED状态,客户端主动发起关闭。
步骤1:客户端发送FIN报文客户端发送FIN=1的报文,序列号seq=u(等于已传输数据的最后一个字节序号+1),进入FIN-WAIT-1状态。
关键点:FIN报文即使不携带数据,也消耗一个序号。
步骤2:服务器响应ACK报文服务器收到FIN后,发送ACK=1的报文,确认号ack=u+1,自身序列号seq=v,进入CLOSE-WAIT状态。
关键点:此时连接处于半关闭状态,客户端停止发送数据,但服务器仍可发送数据。
步骤3:客户端进入FIN-WAIT-2状态客户端收到ACK后,进入FIN-WAIT-2状态,等待服务器发送FIN报文。
步骤4:服务器发送FIN报文服务器发送完剩余数据后,发送FIN=1的报文,确认号ack=u+1,序列号seq=w(可能因发送数据而变化),进入LAST-ACK状态。
步骤5:客户端确认ACK报文客户端收到FIN后,发送ACK=1的报文,确认号ack=w+1,自身序列号seq=u+1,进入TIME-WAIT状态。
关键点:需等待2MSL(最长报文段寿命)时间,确保最后一个ACK到达服务器并消耗旧报文,之后撤销TCB,进入CLOSED状态。
步骤6:服务器进入CLOSED状态服务器收到ACK后,立即撤销TCB,进入CLOSED状态,结束连接。
为何三次握手建立连接,四次挥手终止连接?
三次握手:服务端将SYN和ACK合并到一个报文中发送,减少交互次数。
四次挥手:服务端收到客户端的FIN后,仅表示对方不再发送数据,但自身可能还有数据未发送,因此需先发送ACK确认,待数据发送完毕后再发送FIN,导致ACK和FIN分开发送,增加一次交互。
客户端故障时的处理机制TCP通过保活计时器定期发送探测报文,若多次无响应,则强制释放连接,避免资源占用。