“发送的数据总量相同,完成时间就应接近”忽略了到达过程。固定出口每毫秒服务一个报文时,24 个报文均匀到达可以几乎不排队;同样 24 个报文在很短窗口内到达,最后一部分会等待多个服务周期。

本篇把这个判断做成一个小型可复现实验。研究问题是:总报文数、报文大小和服务率不变时,发送同步程度是否改变队列等待分布;pacing 能否在该模型内缩短尾部等待。第 19、20、35 篇提供拥塞、队列和 incast 前置知识。

假设、基线与判定标准

实验使用离散 FIFO 单服务台。每个报文的服务时间固定为 1000 微秒,每次运行处理 24 个等长报文。三种到达模式只改变时间分布:

  • steady:单个来源每 1000 微秒提交一个报文,并加入 0–200 微秒固定种子抖动。
  • burst:24 个报文都在 0–200 微秒窗口到达。
  • paced:八个来源各发送三个报文,三轮之间间隔 8000 微秒,每轮带 0–200 微秒抖动。

种子固定为 7、19、43。每次运行保存 24 个逐报文等待值,并计算平均值、p50、p99 与最大值。预注册判定是每个种子都满足 burst p99 > paced p99 > steady p99。若任一运行不满足,结论在这个配置下被反驳。

这里的 p99 使用 nearest-rank:对 24 个等待值排序,取第 ceil(0.99 × 24) 个。样本很小,因此 p99 实际等于最大值;文章不会把它外推成线上 p99。

模式提炼:一次只改变待研究变量

固定服务模型与工作量 + 改变到达过程 + 重复固定种子 + 保存原始值

性能结论需要同时交代输入、统计口径和反例。只给一张平均值图,无法判断尾部是否由少数突发产生。

可复跑实现

queue_experiment.py 使用 Python 标准库生成到达时间,按 start = max(arrival, previous_finish) 计算 FIFO 服务开始时刻,等待时间为 start - arrival。它不实现 TCP、拥塞控制或真实队列管理器。

1
2
python3 source/_posts/2026-09-24-计算机网络39-独立研究小项目/queue_experiment.py --help
python3 source/_posts/2026-09-24-计算机网络39-独立研究小项目/queue_experiment.py

素材包括实验配置、实验脚本、逐报文原始数据与汇总、资料与运行记录和审阅记录。

结果与解释

三次重复中,steady 的 p99 保持在很小范围,paced 的 p99 约为一个八报文批次的排队量,burst 的 p99 接近 23 个服务周期。固定工作量并没有固定等待分布,到达同步程度改变了瞬时队列长度。

pacing 在本模型中有效,是因为它把三个八报文批次分隔开,出口能在下一批到达前清空队列。这个结论依赖 pacing 间隔大于一批的服务时间。若把轮次间隔缩短,队列来不及清空;若出口服务率足够高,burst 也可能不产生显著等待。

模型没有反馈环,因此不能声称复现了 TCP 或 QUIC 拥塞控制。RFC 9002 中的拥塞窗口、ACK、丢包检测与 pacing 约束远比单服务台复杂。这里复现的是排队论中的条件化结论:相同总工作量的到达时序不同,会产生不同等待。

反例与证据强度

第一个反例是无限快出口。服务时间趋近零时,三种到达模式的等待都趋近零,同步本身不会造成可观测队列。

第二个反例是足够大的 pacing 间隔只改善发送端可控的突发。如果多个独立来源仍在同一时刻汇聚,单个来源 pacing 不保证消除 incast。

第三个边界是 FIFO。FQ-CoDel 把流隔离与受控延迟算法组合起来,CoDel 根据队列驻留时间采取动作。本文没有实现二者,不能从结果推导其真实参数或收益。

练习

练习一:把 pacing 间隔从 8000 微秒改为 4000 微秒,先预测 p99 如何变化,再运行脚本。解释哪一批报文开始与前一批队列重叠。

练习二:保持 24 个报文不变,把服务时间改为 100 微秒。说明为何 burst 的绝对等待下降,但“同步到达增加队列”的方向仍可能成立。

模式速查表

研究要素 本篇固定内容 结论边界
工作量 24 个等长报文 不代表真实业务大小分布
服务 FIFO、每包 1000 微秒 不代表交换机或内核调度
重复 固定种子 7、19、43 只覆盖 0–200 微秒抖动
原始数据 每包等待时间 没有真实时间戳与抓包
反例 快出口、短 pacing 间隔 结论必须带容量条件

官方一手参考资料

验证边界

已验证:Python 3 标准库在三个固定种子下重复运行 FIFO 离散模型,保存逐报文等待值并检查预注册顺序,验证类型为 STATIC。

NOT_RUN:未使用真实 NIC、交换机、内核 qdisc、TCP/QUIC 实现、硬件时间戳或跨主机链路;没有真实吞吐和延迟测量。模型输出不得与论文或设备结果拼接成性能排名。