一、网络性能基础:OSI模型与TCP/IP协议栈回顾、延迟与吞吐量、基准测试方法
各位好,欢迎来到这门实战课。我是老张,干网络性能优化这行十几年了。今天咱们先打好地基——把OSI模型、TCP/IP协议栈、延迟吞吐量这些概念捋清楚,再聊聊怎么做基准测试。
你可能会问:这些基础东西,网上随便一搜一大把,为什么还要花一节课讲?
嗯,我在项目里见过太多人,拿着Wireshark抓了一大堆包,却不知道问题出在第几层。说白了,你连数据包在哪个环节卡住了都判断不了,优化就无从谈起。所以,这一章我带你把这些概念真正「用起来」。
1.1 OSI模型:你的网络排错地图
OSI七层模型,很多人觉得它只是个理论框架。但我告诉你,它其实是网络排错最实用的地图。
我个人习惯,遇到网络问题先问自己:问题出在哪一层?
- 物理层(第1层):网线断了?光模块坏了?信号衰减?——我遇到过机房光纤被老鼠咬断,折腾了两小时才发现。
- 数据链路层(第2层):MAC地址冲突?交换机端口协商失败?——有一次某台服务器网卡强制设为100M全双工,对端交换机是1000M自动协商,结果丢包惨不忍睹。
- 网络层(第3层):路由环路?IP地址冲突?——这是Wireshark分析的重灾区。
- 传输层(第4层):TCP重传?窗口太小?——性能瓶颈最常见的地方。
- 会话层、表示层、应用层(第5-7层):协议交互异常?数据格式问题?
我的经验法则:80%的性能问题集中在第3层和第4层。所以Wireshark分析时,优先盯着IP和TCP头部。
下面这张图,是我自己画的一个OSI模型与TCP/IP协议栈的对应关系,你把它存下来,以后排错时对照着看。
1.2 网络延迟与吞吐量:两个核心指标
做性能优化,你天天跟这两个指标打交道。但很多人把它们搞混了。
延迟(Latency)
延迟就是数据从A点到B点花的时间。单位通常是毫秒(ms)。
我把它拆成四个部分:
- 处理延迟:设备处理数据包的时间。路由器查路由表、防火墙做策略匹配,都算。
- 排队延迟:数据包在缓冲区排队等待转发的时间。网络一拥塞,这个值就飙升。
- 传输延迟:把数据比特放到链路上的时间。取决于数据包大小和链路速率。
- 传播延迟:信号在介质中传播的时间。取决于物理距离,光速是上限。
一个小技巧:用Wireshark看TCP握手时间,就能估算出客户端到服务器的往返延迟(RTT)。我一般用这个值判断是不是物理距离导致的延迟高。
吞吐量(Throughput)
吞吐量是单位时间内成功传输的数据量。单位是bps(比特每秒)或Bps(字节每秒)。
注意,吞吐量不等于带宽。带宽是理论最大值,吞吐量是实际能达到的值。中间差的就是各种损耗。
| 指标 | 定义 | 单位 | Wireshark怎么看 |
|---|---|---|---|
| 延迟 | 数据从源到目的的时间 | ms | Statistics → TCP Stream Graph → Round Trip Time |
| 吞吐量 | 单位时间成功传输的数据量 | bps / Bps | Statistics → I/O Graph |
| 带宽 | 链路理论最大传输速率 | bps | 接口配置或协商结果 |
| 丢包率 | 丢失数据包占总发送量的比例 | 百分比 | Statistics → TCP Stream Graph → Throughput |
1.3 性能基准测试方法
没有基准,你拿什么判断优化有没有效果?
我个人习惯,做任何优化之前,先跑一轮基准测试。优化完再跑一轮,对比数据说话。
测试工具推荐
- iPerf3:测TCP/UDP吞吐量的利器。命令行搞定,轻量好用。
- ping:测延迟和丢包率。虽然简单,但很实用。
- mtr:结合traceroute和ping,看每一跳的延迟和丢包。
- Wireshark:抓包分析,看应用层的真实交互延迟。
基准测试步骤
- 确定测试目标:你要测什么?端到端延迟?TCP吞吐量?还是某个应用的响应时间?
- 搭建测试环境:尽量模拟生产环境,但排除干扰因素。我一般会在非业务高峰期测。
- 执行测试:跑至少3轮,取平均值。单次测试结果不可信。
- 记录数据:延迟、吞吐量、丢包率、CPU/内存占用,全记下来。
- 分析结果:跟预期值对比。偏差超过20%,就要深挖原因了。
避坑指南:我曾经在测试时没关防火墙的DPI(深度包检测),结果吞吐量只有正常值的30%。折腾了半天才发现是防火墙在「捣乱」。所以,测试前一定要确认中间设备没有开启额外的处理功能。
iPerf3 实战示例
假设你要测两台服务器之间的TCP吞吐量:
# 服务端(IP: 192.168.1.100)
iperf3 -s -p 5201
# 客户端
iperf3 -c 192.168.1.100 -p 5201 -t 30 -i 1
参数说明:
-s:服务端模式-c:客户端模式,后面跟服务端IP-p:端口号-t:测试时长(秒)-i:报告间隔(秒)
输出结果里,重点关注 sender 和 receiver 的吞吐量。如果两者差距大,说明链路有丢包或拥塞。
我的习惯:基准测试结果一定要保存到文件里,标注好测试时间、网络拓扑、设备配置。这样以后回溯问题时,才有据可查。