2. 延迟基础概念

今天我们来聊聊延迟——网络里最基础、也最容易被忽视的概念。说白了,延迟就是数据从 A 点飞到 B 点所花的时间。我经常跟刚入行的同事说:别把带宽和延迟搞混,带宽是管道有多粗,延迟是水从这头到那头要多久。

举个例子,你 ping 一个服务器,返回的 RTT(往返时间)是 30ms。这个 30ms 就是双向延迟。但很多场景下,我们真正关心的是单向延迟——比如语音通话,你这边说一句话,对方听到的时间差。

2.1 单向延迟 vs 双向延迟

单向延迟:数据从发送端到接收端的单程时间。双向延迟(RTT):数据去一趟再回来的总时间。看起来很简单对吧?但实际工程里,单向延迟很难直接测,因为你需要两边的时钟同步。

我做过一个跨国专线的项目,客户抱怨视频会议卡顿。拉出 ping 的 RTT 只有 80ms,按理说挺好。但单向延迟测量发现,从上海到洛杉矶是 75ms,回来却只有 5ms。为什么?因为去程路由多绕了一个节点,排队也严重。只看 RTT 的话,80ms 很平均,但单向不对称导致了视频卡顿。

类型定义测量方式典型应用场景
单向延迟源到目的的单程时间需要时钟同步(PTP/NTP)实时语音、在线游戏、工业控制
双向延迟(RTT)发送到接收再返回的时间直接 ping 即可简单连通性检查、TCP 超时计算
避坑指南: 我曾经天真地以为 RTT/2 就是单向延迟。结果在同一条链路上,由于路径不对称、队列方向不同,RTT/2 可能偏差 30% 以上。所以做延迟预算时,一定要分方向测量,或者直接采用单向延迟数据。

2.2 延迟的四驾马车

一个数据包从网卡发出到对端收完,中间经过的时间可以拆成四部分。你想想看,每个环节都可能成为瓶颈。我按典型顺序来拆:

  1. 处理延迟(Processing Delay)——路由器、交换机检查包头、查路由表、做 ACL 过滤的时间。一般是微秒级,但如果你用了深度包检测(DPI),可能飙升到毫秒级。
  2. 排队延迟(Queuing Delay)——数据包在出口队列里等的时长。这是最不稳定的部分,流量一拥塞它就变大。我记得有个客户,核心交换机突然出现周期性抖动,排查下来是因为一个端口的出队列策略被改成了 FIFO,背景流量一冲,VoIP 包被堵在尾部。
  3. 传输延迟(Transmission Delay)——把数据比特推到链路上去的时间。公式很简单:帧长 / 带宽。10GE 发一个 1500 字节的包,传输延迟约 1.2μs;要是 1.5M 的旧链路,同样的包要 8ms。差距就在这里。
  4. 传播延迟(Propagation Delay)——信号在介质上跑的时间。取决于物理距离和介质中的光速。光纤里大约是 5μs/km。跨洋海底光缆 10000km,单程传播延迟就是 50ms。这玩意你换再大的带宽也减不了,除非挖隧道。
个人经验: 做数据中心内部延迟优化时,我重点关注排队延迟和传输延迟。处理延迟靠硬件加速,传播延迟在同一个园区基本忽略。但一旦做广域网优化,传播延迟立刻成为大头,必须靠 TCP 优化、窗口放大、甚至多路径来缓解。

2.3 从端到端看延迟叠加

一个包从源主机到目的主机,通常要经过多个网络节点。在每个节点上,这四个延迟都会出现。最终端到端延迟是沿途所有节点各部分延迟之和。

我画了一张图,把整个路径的延迟组成可视化出来。这样才能一目了然地看出哪个环节是瓶颈。

端到端延迟组成结构图 端到端延迟组成结构图 发送端 处理延迟 排队延迟 传输延迟 传播延迟 接收端 注意:传播延迟由物理距离决定,带宽再大也减不了 排队延迟是抖动的主要来源,也是最难预测的部分 端到端延迟 = 处理延迟 + 排队延迟 + 传输延迟 + 传播延迟

从图里能看出,每个网络节点都会贡献一段处理、排队、传输和传播延迟。加起来就是总延迟。我在做延迟预算表的时候,习惯把所有节点列出来,逐段估算:比如接入交换机处理 10μs + 排队可能 0~5ms……最后加起来,心里就有底了。

2.4 几个容易混淆的细节

  • 传输延迟 vs 传播延迟——传输延迟取决于包大小和链路速率,传播延迟取决于距离。两者独立,不能混为一谈。我曾经遇到一个客户,坚信把带宽从 100M 升到 1G 就能解决跨洋延迟问题。我只好拿出公式算给他看:传播延迟 55ms 纹丝不动,升带宽只减少了传输延迟(几百微秒),对他那种大文件传输场景毫无帮助。
  • 排队延迟的不可预测性——它跟瞬时流量负载强相关。做 QoS 时,我们通过配置拥塞管理算法(比如 WFQ、LLQ)来给关键业务“插队”,本质上就是牺牲其他流的排队延迟来保证关键流的低延迟。
  • 处理延迟的隐藏成本——除了路由器转发,还要考虑宿主机协议栈的处理(TCP 卸载、中断合并等)。在 10G+ 网卡上,主机处理延迟甚至可能超过网络转发延迟。
小技巧: 做端到端延迟测试时,别只依赖 ping。用 iperf 打 UDP 流,配合 tcpdump 抓包,在收发两端打时间戳,才能真实反映单向延迟和抖动。我在排视频卡顿问题时,经常这么干。

嗯,基础概念先到这。记住这四驾马车的特性和区别,后面讲延迟计算模型和 Qci 过滤的时候,你会反复用到它们。