一台发送端向一台接收端发送数据时链路并不拥塞,八台发送端同时回复同一台接收端时却可能排队。数据中心网络的特殊之处并非使用了另一套 IP,而是短距离、高带宽、多路径和同步扇入把流量集中到很小的时间窗口。

第 11 篇讨论等价路径,第 19、20 篇讨论拥塞窗口和队列。本篇用两级 Clos 与固定突发模型解释路径多样性、ECMP 冲突、incast 和尾延迟,不给真实设备性能排名。

Clos 提供多条可用路径

两级 leaf-spine 拓扑中,每台 leaf 连接每台 spine。位于不同 leaf 的主机之间可以经任一 spine 转发。在端口速率相等且不存在超额订阅的理想条件下,这种结构能提供规则化的路径容量;实际网络还受上联数量、链路速率、故障和布线约束。

“存在两条等价路径”不代表一条流会同时均匀占用两条。常见 ECMP 实现对报文头字段计算哈希,把一个流放入某个下一跳桶。这样可避免普通流的包在不同延迟路径上频繁乱序,但多个大流可能哈希到同一条链路,另一条链路仍有空闲容量。

RFC 2992 分析的是一种等价多路径哈希算法。具体交换机使用哪些字段、哈希种子和重映射策略属于实现行为,不能由“支持 ECMP”四个字推出。

模式提炼:路径容量要看映射结果

可用路径集合 × 流到路径的映射 × 每条路径负载 = 实际拥塞位置

拓扑图只能说明容量可能存在。判断某次拥塞还需要流键、哈希结果、链路计数和故障时的重映射证据。

incast 把瓶颈推到接收端出口

incast 是多个发送端在短时间内向同一接收端汇聚的流量形态。即使每个发送端入口都不满,最后一跳出口仍需串行发送所有报文。多个回复越同步,交换机越难用空闲时隙消化突发。

同名素材中的模型令每个发送端同时提交 32 个 1500 字节报文,接收端出口固定为 1 Gbit/s。一个报文的理想串行化时间是 12 微秒。一个发送端时,最后一个报文开始服务前等待 372 微秒;八个发送端同时到达时,最后一个报文等待 3060 微秒。

这些数值只由模型输入得到,没有传播时延、交换结构、协议头、ACK、TCP 恢复、调度粒度或发送节奏。它们证明同步输入会扩大共享出口的队列工作量,不是对某款交换机的测量。

尾延迟描述慢请求分布

平均值会掩盖少量很慢的请求。若一次上层操作必须等待多个分片回复,完成时间由最慢分片决定;某一条路径的排队、重传或后端暂停都可能落到整体尾部。

尾延迟必须带百分位、样本集合和时间窗口,例如“固定实验中 1000 次请求完成时间的 p99”。只报告“尾延迟 3 ms”而不说明口径,没有可比性。本文的最后报文等待时间也不是 p99,因为模型没有重复采样形成分布。

RFC 8257 描述 DCTCP 时把数据中心中的浅缓冲、高突发和 incast 作为适用背景,并要求端点与网络支持 ECN 反馈。它不能推出所有数据中心都部署 DCTCP,也不能把 ECN 标记等同于没有排队。

有界拓扑与队列验证

incast_model.py 读取固定拓扑,计算 16 条流在两个 ECMP 桶中的分布,并比较单发送端与八发送端同步突发的最后一包等待时间。

1
2
python3 source/_posts/2026-09-24-计算机网络35-数据中心网络为何不同/incast_model.py --help
python3 source/_posts/2026-09-24-计算机网络35-数据中心网络为何不同/incast_model.py

素材包括固定拓扑与负载、队列演算脚本、演算输出、资料与运行记录和审阅记录。

条件、限制和反例

Clos 不自动保证无阻塞。leaf 上联超额订阅、故障后的剩余容量、交换芯片内部结构和下行热点都可能成为瓶颈。

ECMP 不自动实现逐流公平。哈希碰撞会使流量倾斜;逐包分担虽能改善某些分布,也可能引入乱序。具体选择必须结合设备能力和传输行为。

多发送端不必然产生 incast。发送时间足够分散、总输入速率低于出口服务率或接收端分片不同时完成时,队列可能保持很短。反过来,单个发送端也能以微突发占满更慢出口。

练习

练习一:四个发送端各同时提交 20 个 1000 字节报文,出口为 2 Gbit/s。忽略全部协议开销,计算最后一包开始服务前的等待时间,并列出模型没有覆盖的因素。

练习二:两条等价上联中一条利用率接近 100%,另一条接近 20%。列出至少三个与 ECMP 映射有关的解释,以及需要保存的反证。

模式速查表

现象 需要的证据 容易误判
拓扑有多条路径 路由与下一跳集合 单流必然拆到多路
一条上联拥塞 流键、哈希与链路计数 整个 fabric 容量不足
多发送端同时变慢 到达时序与共享出口队列 每台发送端入口拥塞
p99 升高 完整分布、窗口和样本数 平均值同步升高
ECN 标记出现 阈值、队列与端点响应 网络没有丢包风险

官方与一手参考资料

验证边界

已验证:Python 3 标准库对固定 Clos 拓扑执行 ECMP 桶映射,并手算同步突发在单一出口的串行化与最后报文等待时间,验证类型为 HAND_CALC。

NOT_RUN:没有交换机、受控链路、队列遥测、ECN/DCTCP、真实 TCP 流、重复实验或延迟分布。未测量吞吐、p99 或生产网络;补证需在隔离仿真器、专用测试床或获准实验环境中完成。