目录

TCP流在多个负载均衡器上的碰撞问题(串流问题)

TCP流在多个负载均衡器上的碰撞问题(串流问题)

本文有中英双语版本,由英文编写并由 DeepSeek 翻译为中文。

现象描述

在典型的高并发场景中(如游戏服务器或聊天平台),服务器集群需处理数十亿的并发TCP连接。为实现这一目标,需部署分布式基础设施组件(包括Kubernetes Pod和虚拟机)。流量聚合层——通常由多个负载均衡器(Load Balancers, LBs)实现——是构建高效框架的关键。

关于负载均衡器的原理,可参考Wikipedia等资源。两种常见实现方式是反向代理和DNAT(目标网络地址转换),而TCP流碰撞问题特发于基于DNAT的负载均衡器

以下模拟两条流的碰撞场景:

此场景中:

  1. Flow1Flow2 源于同一客户端(IP1:PORT1
  2. 目标为不同网关端点(GWIP1:GWPORT1 vs GWIP2:GWPORT2
  3. 因目标不同,客户端TCP协议栈复用源端口
  4. 高并发下端口复用概率显著增加
  5. 两网关执行 DNAT,目标地址被重写为 VMIP1:VMPORT1
  6. 当哈希至同一后端VM时,两流拥有完全相同的五元组:
    (SrcIP=IP1, SrcPort=PORT1, DstIP=VMIP1, DstPort=VMPORT1, Protocol=TCP)
  7. 五元组碰撞导致服务器错误识别数据流

碰撞发生条件

TCP流碰撞由四元组匹配的特定巧合引发,其影响因部署场景而异:

客户端类型 碰撞风险 建议措施
直连用户客户端(单IP连接量低) 可忽略(< 0.001%) 风险可接受 实施标准TCP重试机制
网关聚合流量(CDN/抗DDoS出口点) 高(>1%可能) 需规避措施 少数网关IP承载海量流量时尤甚

TCP流碰撞概率公式

以下结果来自DeepSeek-R1。为简化模型,假设所有流来自同一客户端。多客户端均匀分布时结果相同。
该公式未经概率论严格证明。通过Golang程序模拟验证,结果相近,仅供参考。

参数定义

  • N = 并发TCP流总量
  • R = 后端真实服务器数量
  • S = 源端口范围大小(通常为64,512)
  • L = 负载均衡器数量(各含独立VIP)
  • C = 独立客户端IP数

核心假设

  1. 每个LB拥有独立虚拟IP(VIP)
  2. 流量在LB间均匀分布(每LB流量 $N/L$)
  3. DNAT后真实服务器可见原始客户端IP/端口
  4. 当两条流满足以下条件时发生碰撞:
    (客户端IP, 客户端端口, 服务器IP, 服务器端口) 完全相同

公式推导

  1. 每LB流量分布
    流指向LB $i$ 的概率:$P(LB_i) = \frac{1}{L}$
  2. 碰撞条件
    • 相同客户端IP/端口(概率 $\frac{1}{C \cdot S}$)
    • 不同LB(概率 $\frac{L-1}{L}$)
    • 相同真实服务器(概率 $\frac{1}{R}$)
  3. 简化保守模型

$$ P_{\text{collision}} \approx \left(1 - \left(1 - \frac{1}{R \cdot S}\right)^{N \cdot \frac{L-1}{L}}\right) \times 100% $$


模拟结果

1
2
3
4
5
6
7
N(10000) R(10) S(60000) L(1) C(1) Simulation collision: 0.000%, Formula collision: 0.000%
N(10000) R(10) S(60000) L(2) C(1) Simulation collision: 0.820%, Formula collision: 0.830%
N(100000) R(10) S(60000) L(2) C(1) Simulation collision: 8.358%, Formula collision: 7.996%
N(100000) R(20) S(60000) L(2) C(1) Simulation collision: 4.198%, Formula collision: 4.081%
N(100000) R(30) S(60000) L(2) C(1) Simulation collision: 2.762%, Formula collision: 2.740%
N(100000) R(30) S(60000) L(3) C(1) Simulation collision: 3.700%, Formula collision: 3.636%
N(200000) R(30) S(60000) L(3) C(2) Simulation collision: 3.623%, Formula collision: 3.636%

规避策略

隔离上游网关

  • 机制:为每个网关分配专属后端服务器
  • 效果:消除跨网关四元组碰撞
  • 部署:需网关感知的负载均衡

增加客户端IP多样性

根据公式,碰撞概率与并发流总量正相关:

  • 扩大客户端IP池
  • 启用IPv6拓展IP空间

优化负载均衡器数量

增加LB数量可能加剧碰撞,减少LB则可降低碰撞概率。

切换LB至Fullnat模式

迁移至FullNat模式可根除流碰撞,但需LB具备更高性能和资源能力。