TCP 流分析82 条

TCP 拥塞控制概览

发送方按拥塞窗口(cwnd)控制未确认数据量:慢启动指数增长、丢包后收缩;抓包通过"发送节奏与丢包反应"间接观察算法行为。

拥塞控制是什么

发送方用拥塞窗口控制同时未被确认的数据量:起步阶段指数增长,达到阈值后转为线性增长,遇到丢包就收缩。Linux 默认使用 CUBIC,也可以切换到 BBR 等算法。拥塞参数本身不会出现在抓包里,只能通过发送节奏与丢包后的反应间接推断。

基本信息

控制对象发送方可同时未确认的数据量
常见算法CUBIC(Linux 默认)、BBR、Reno 等
观测方式发送速率曲线与丢包后的窗口变化
相关字段重传标注、吞吐曲线、往返时延
调参影响不同算法对时延与丢包的敏感度差异明显

典型使用场景

  • 解释为什么链路没有明显拥塞但吞吐上不去
  • 评估丢包发生后业务恢复的快慢
  • 对比不同算法在长距离链路上的表现
  • 判断速率曲线的锯齿形态是否属于正常的拥塞循环
  • 为跨地域传输选择更合适的发送端配置

观察线索

观察线索
起步阶段快速上涨        # 慢启动阶段
丢包后发送骤减          # 拥塞窗口收缩
RTT 上升仍持续加大发送  # 可能为对丢包不敏感的算法
速率呈规律锯齿          # 收缩与恢复循环
长期低速率              # 窗口或路径受限

线索与结论

观察线索可能结论说明
起步快速上涨处于慢启动阶段属于正常行为
丢包后发送骤减典型的拥塞响应收缩与恢复循环
时延上升仍加大发送可能使用 BBR 类算法对丢包不如传统算法敏感
速率长期上不去窗口或路径受限结合窗口与往返时延判断
丢包不等于拥塞:链路误码与限速也会触发类似反应,需要看丢包的分布与位置。
更换拥塞算法前先确认瓶颈在哪里,否则容易把问题掩盖过去。

补充要点

  • 把吞吐曲线与往返时延曲线叠在一起看,能区分拥塞响应与路径本身变慢
  • 规律性的速率锯齿通常说明机制在正常工作,不必当作故障
  • 发送端与接收端部署在不同区域时,算法选择对体验的影响会被时延放大
  • 调优后要用同样的业务场景复测,指标口径保持一致
抓包只能观察外部行为,算法参数需要结合发送端配置与内核信息一起判断。

易错点

  • 看到丢包就断言链路拥塞:误码与限速同样会造成丢包,结论可能完全错位
  • 为提高吞吐盲目更换算法,掩盖了窗口或接收侧的真实瓶颈
  • 把速率锯齿当作故障处理,浪费时间去优化本来就正常的机制

数据来源与参考

  • RFC 5681(拥塞控制)
  • RFC 9438(CUBIC)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌