1. 延迟的本质:从物理极限到软件开销
做网络优化这么多年,我见过太多人一上来就调参数、改代码,结果折腾半天没什么效果。为什么?因为他们没搞明白一个最根本的问题——延迟到底是从哪来的。
说白了,网络延迟不是单一的东西。它像一根链条,由四个环节串联而成。任何一个环节出问题,整体延迟就上去了。今天我就把这四个环节掰开揉碎讲清楚。
1.1 传播延迟:光速也救不了你
传播延迟,就是信号在物理介质上跑路的时间。这个延迟由两个因素决定:距离和介质中的传播速度。
光在真空中的速度是 3×10⁸ m/s,但在光纤里,这个速度会降到大约 2×10⁸ m/s。为什么?因为光纤的折射率让光走的是折线,不是直线。嗯,这里要注意,很多人以为光纤里光速还是 3×10⁸,其实不是。
举个例子:北京到上海,直线距离约 1000 公里。在光纤里,光跑一趟需要:
传播延迟 = 距离 / 速度
= 1000×10³ m / (2×10⁸ m/s)
= 5 ms
这 5 毫秒,是物理极限。你换再好的交换机、再优化的协议,也减不掉这 5 毫秒。这就是为什么金融交易公司要把服务器放在交易所旁边——每近 1 公里,就能省下 5 微秒。
1.2 传输延迟:带宽的真相
传输延迟,很多人把它和传播延迟搞混。我刚开始做网络时也犯过这个错。传输延迟指的是:把数据全部推上线需要多长时间。
计算公式很简单:
传输延迟 = 数据包大小 / 链路带宽
举个例子:你要发一个 1500 字节的以太网帧,链路是 1 Gbps:
传输延迟 = 1500 × 8 bits / 1×10⁹ bps
= 12 微秒
如果链路换成 10 Gbps,传输延迟就降到 1.2 微秒。你看,带宽越大,传输延迟越小。但这里有个坑——带宽不是万能的。
1.3 处理延迟:最容易被忽视的环节
处理延迟,就是数据在网络设备里被处理的时间。包括:
- 查路由表:交换机/路由器决定把数据包往哪送
- NAT 转换:修改 IP 地址和端口
- 防火墙检查:过滤规则匹配
- 协议栈处理:TCP 分段、重组、校验和计算
这个环节,是软件工程师最能发挥价值的地方。为什么?因为很多处理延迟是不必要的。
我记得有个项目,客户抱怨他们的交易系统延迟高。我抓包一看,发现每个数据包都被防火墙做了深度包检测(DPI)。但问题是,这些流量都是内部可信网络,根本不需要 DPI。关掉之后,延迟直接降了 40%。
1.4 排队延迟:看不见的杀手
排队延迟,是数据包在设备缓冲区里等待被处理的时间。这个延迟最隐蔽,也最致命。
为什么会排队?因为数据到达的速度超过了设备处理的速度。就像高速公路收费站,车来得太多,就得排队。
排队延迟的公式是:
排队延迟 = (队列长度 × 平均包大小) / 处理速率
但实际情况比公式复杂得多。因为网络流量是突发性的,不是均匀的。你想想看,一个 1 Gbps 的链路,平时利用率只有 30%,但突然来了一波突发流量,瞬间冲到 90%,队列就开始堆积了。
这就是所谓的微突发(microburst)问题。我在项目中遇到过好几次,监控面板上看平均利用率不高,但实际延迟已经飙升到几百毫秒了。
1.5 四个延迟的关系:一张图看懂
下面这张图,是我自己总结的延迟构成模型。每次做优化前,我都会先画一遍,帮自己理清思路。
1.6 实战:如何测量这四个延迟
光说不练假把式。我分享一下我在项目中常用的测量方法:
| 延迟类型 | 测量工具 | 方法 |
|---|---|---|
| 传播延迟 | ping | RTT / 2,排除处理时间 |
| 传输延迟 | iperf | 改变包大小,观察延迟变化 |
| 处理延迟 | tcpdump + 时间戳 | 抓包分析设备入口和出口的时间差 |
| 排队延迟 | netstat -s | 观察队列溢出和丢包统计 |
1.7 小结
延迟不是玄学,它是可以分解、可以测量、可以优化的。记住四个构成:
- 传播延迟:物理极限,认命,但可以缩短距离
- 传输延迟:带宽游戏,加带宽有效,但别过度
- 处理延迟:软件优化的主战场,砍掉不必要的处理
- 排队延迟:最隐蔽的杀手,需要流量管理和缓冲区调优
搞清楚了这些,你再看网络优化,就不会再盲目了。下一节,我会讲如何用这些知识,一步步构建一个超低延迟的网络架构。