TCP三次握手是服务器与客户端建立可靠连接的基础机制,它通过三次报文交换确认双方通信能力,并同步初始序列号。
什么是三次握手? 服务器与客户端的第一步对话
三次握手是TCP协议在正式传输数据前,客户端与服务器互相确认身份、同步状态的过程,你可以把它想象成双方通话前的“测试”环节:先确认对方在线,再确认自己能听到,最后确认对方也能听到自己。
三次握手的核心角色:客户端与服务器
- 客户端:主动发起连接请求的一方,通常代表用户设备或应用程序。
- 服务器:被动等待连接的设备,持续监听特定端口准备响应。
三次握手具体做了哪些事
- 同步双方的初始序列号,确保后续数据有序交付。
- 交换窗口大小信息,让彼此知道一次能收多少数据。
- 确认对方具备接收和发送能力,避免虚假连接浪费资源。
三次握手为什么是三次,而不是两次或四次?
这是TCP设计中一个经典问题,也是用户搜索频率较高的疑问点。
两次握手的问题
如果只进行两次握手,服务器在收到客户端的SYN后立即分配资源并进入ESTABLISHED状态,但客户端可能因为网络延迟根本没收到SYN+ACK,这时客户端会重发SYN,而服务器认为旧连接已建立,残留的脏数据包会造成资源浪费,行业共识认为,两次握手无法解决“已失效的连接请求报文段”突然传输到服务器的问题,这是TCP可靠性的关键漏洞。
四次握手的冗余
三次握手已经能保证双方均确认对端收发能力,四次握手会产生额外一次往返,增加延迟,而且对可靠性没有实质提升,在实际网络环境中,三次握手达成了效率与可靠性的平衡,因此成为标准。
三次握手详细流程:从SYN到ACK
理解具体步骤是排查网络故障的基础,每个阶段都有明确的状态标识和报文标志。
第一次握手:客户端发送SYN
- 客户端向服务器发送一个SYN=1,seq=x的报文段。
- 客户端进入SYN_SENT状态,等待服务器确认。
- 此时客户端无法发送数据,但可以接收。
第二次握手:服务器回复SYN+ACK
- 服务器收到SYN后,如果同意连接,回复SYN=1,ACK=1,seq=y,ack=x+1的报文。
- 服务器进入SYN_RCVD状态,并分配资源给该连接。
- 这一步同时确认了客户端发送能力,并告知自己的初始序列号。
第三次握手:客户端发送ACK
- 客户端收到SYN+ACK后,发送ACK=1,seq=x+1,ack=y+1的报文。
- 客户端进入ESTABLISHED状态,开始准备传输数据。
- 服务器收到ACK后也进入ESTABLISHED状态,连接建立完成。
核心要点:每一步的序列号都必须严格递增,否则对端会丢弃报文并触发重传,这也是为什么在服务器配置较低时,高并发下三次握手容易超时。
三次握手进阶:超时重传与拥塞控制
三次握手并非总是成功,网络环境复杂时会出现超时、重传甚至攻击。
SYN超时与重传
- 客户端发送SYN后,如果在规定时间内未收到SYN+ACK,就会重传SYN。
- 默认重传次数为5次,间隔逐渐增大,总耗时约127秒,如果服务器负载过高或网络延迟大,这个时间会显著拉长。
- 在本地服务器搭建场景里,可以通过调整
tcp_syn_retries参数缩短等待时间,但这需要权衡对端可靠性。
SYN Flood攻击原理
- 攻击者伪造大量SYN请求,但不完成第三次握手,导致服务器维护大量半连接队列,耗尽资源。
- 防护手段包括:启用SYN Cookie、缩短SYN超时时间、增大半连接队列长度,多数云服务商默认开启SYN Cookie,但
在定制化服务器配置时,你需要确认此功能是否生效
。
对服务器配置的影响
- 服务器CPU和内存决定了能同时处理多少半连接请求。较大比例的高并发故障源于三次握手阶段的资源耗尽,而非数据交换阶段。
- 如果你在考虑服务器搭建价格,通常更贵的配置能提供更大的半连接队列和更快的SYN处理速度,但实际瓶颈往往在带宽和网络延迟上。
三次握手与四次挥手区别
连接建立和连接关闭是两个对称但逻辑不同的过程,用户常混淆两者的状态变化。
| 特性 | 三次握手 | 四次挥手 |
|---|---|---|
| 目的 | 建立连接,同步序列号 | 关闭连接,释放资源 |
| 报文数量 | 3个 | 4个 |
| 主动方 | 始终是客户端 | 可以是客户端或服务器 |
| 状态变化 | SYN_SENT、SYN_RCVD、ESTABLISHED | FIN_WAIT_1、CLOSE_WAIT、TIME_WAIT等 |
| 数据传输 | 握手期间不能携带有效数据 | 挥手期间可以继续传输残余数据 |
| 可靠性要求 | 必须确认对端接收能力 | 必须确保所有数据被对端接收 |
三次握手与四次挥手区别的核心在于:建立时双方必须同步初始状态,而关闭时需要对半关闭状态做额外处理,所以需要四次。
实际场景中的三次握手:地域节点与延迟
用户在选择服务器时,地域节点直接影响三次握手的往返时间。
网络延迟对握手的影响
- 国内服务器地域节点平均延迟在10-50ms之间,而海外服务器可能达到150-300ms,三次握手需要5个RTT(往返时间),所以延迟直接决定了连接建立速度。
- 当用户访问位于美国西海岸的服务器时,仅三次握手就可能耗时400ms,严重影响用户体验。据工信部相关调研数据,多数用户可接受的连接建立延迟在200ms以内。
如何优化握手延迟
- 使用CDN将静态内容分发到靠近用户的地域节点,减少物理距离。
- 部署BGP多线服务器,让不同运营商用户通过最优路径接入。
- 在服务器端开启TCP Fast Open(TFO),允许在SYN阶段携带数据,减少一次RTT。
三次握手不是抽象理论,而是直接影响网络体验的根基,当你排查连接超时、配置服务器参数或选择地域节点时,三次握手的状态变化和超时机制就是最直接的判断依据。
三次握手常见问题解答
为什么三次握手不改成两次?
两次握手无法处理旧连接请求的残留问题,如果客户端发送的SYN在网络中滞留,服务器收到后误以为新连接并分配资源,随后客户端重传SYN建立新连接,服务器上就会残留一个无效连接,浪费资源且可能造成数据混乱。
什么是半连接队列?
半连接队列是服务器在SYN_RCVD状态下存放的未完成连接列表,当服务器收到SYN后会分配一个条目放入半连接队列,等待第三次握手ACK确认,如果队列满了,服务器会丢弃新SYN。调整tcp_max_syn_backlog参数可以增大队列容量,但需要结合服务器内存和CPU综合评估。
三次握手可以携带数据吗?
按照标准实现,第三次握手ACK报文可以携带数据,因为此时客户端已经确认服务器接收能力,但第一次和第二次握手不能携带有效数据,因为此时双方尚未确认对端能力,携带数据会被丢弃或引发混乱。实际应用中,TFO技术允许在SYN中携带少量数据,但需要服务器和客户端都支持该特性。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/509631.html



