tcp协议
tcp协议
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认,第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),(syn=k),即SYN+ACK包,第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
扩展
TCP三次握手是建立可靠连接的核心机制,确保通信双方同步序列号、确认网络可达性并协商传输参数。以下是详细过程及技术细节:
一、三次握手的具体步骤
- 第一次握手(SYN包)
客户端动作:发送SYN包(
seq=j
),标志位SYN=1
,进入SYNSent
状态,等待服务器响应。技术细节:SYN包不携带数据,但消耗一个序列号,因此初始序号
j
由客户端随机生成,用于后续数据同步。目的:向服务器发起连接请求,并传递初始序列号及支持的TCP选项(如MSS、窗口大小)。
- 第二次握手(SYN+ACK包)
服务器动作:收到SYN包后,发送
SYN+ACK
包(seq=k
,ack=j+1
),标志位SYN=1
和ACK=1
,进入SYNRecv
状态。技术细节:
服务器需分配半连接队列条目,记录客户端信息并设置超时重传机制。
确认号
ack=j+1
表示已正确接收客户端的初始序列号。异常处理:若服务器队列已满或检测到SYN洪水攻击,可能丢弃请求或使用SYN Cookie机制防御。
- 第三次握手(ACK包)
客户端动作:发送ACK包(
ack=k+1
),标志位ACK=1
,进入Established
状态;服务器收到后也进入Established
状态,连接建立完成。技术细节:
客户端需验证服务器的
seq=k
和ack=j+1
的合法性,防止旧连接残留数据干扰。若使用时间戳选项,还需检查时间戳是否在有效区间内。
数据传输准备:双方已同步初始序列号(
j
和k
)、窗口大小及MSS,可开始可靠传输。
二、三次握手的必要性与设计考量
- 双向通信验证
三次握手确保客户端与服务器均具备双向通信能力,避免单向可达性问题。例如,若仅两次握手,服务器无法确认客户端的ACK是否可达。
- 防止历史连接干扰
若仅两次握手,可能因旧连接的延迟SYN包导致新连接误判。第三次握手通过客户端确认服务器的最新状态,彻底排除此类风险。
- 半连接队列管理
服务器维护半连接队列(SYNRecv
状态),记录未完成握手的请求。若超时未收到客户端ACK,队列条目将被清除,防止资源泄漏。
三、异常场景与优化机制
- 半开连接
若客户端未收到服务器的SYN+ACK(如网络丢包),会触发重传机制;若重传次数超限(通常3-5次),则终止连接。
- 延迟确认
客户端可能在收到数据时才发送ACK,而非立即响应,以减少网络开销。但第三次握手的ACK必须及时发送,确保连接快速建立。
- 性能优化
SYN Cookie:在服务器队列满时,通过加密算法生成临时Cookie,避免SYN洪水攻击。
快速打开(TFO):允许在三次握手中直接传输数据,减少RTT延迟。
四、总结
三次握手通过严格的序列号同步和双向确认机制,实现了TCP连接的可靠性与安全性。其设计不仅考虑了基本通信需求,还通过半连接队列、超时重传等机制应对网络不确定性。理解这一过程对网络调试、性能优化及协议安全防护具有重要意义。