一、网络性能基础: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协议栈的对应关系,你把它存下来,以后排错时对照着看。

OSI模型 vs TCP/IP协议栈 对应关系 应用层 (7) 表示层 (6) 会话层 (5) 传输层 (4) 网络层 (3) 数据链路层 (2) 物理层 (1) 应用层 (HTTP, FTP, DNS, SMTP...) 传输层 网络层 网络接口层 (以太网, Wi-Fi...) Wireshark 关注重点 第3层:IP头部分析 第4层:TCP重传/窗口 第7层:应用协议交互

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:抓包分析,看应用层的真实交互延迟。

基准测试步骤

  1. 确定测试目标:你要测什么?端到端延迟?TCP吞吐量?还是某个应用的响应时间?
  2. 搭建测试环境:尽量模拟生产环境,但排除干扰因素。我一般会在非业务高峰期测。
  3. 执行测试:跑至少3轮,取平均值。单次测试结果不可信。
  4. 记录数据:延迟、吞吐量、丢包率、CPU/内存占用,全记下来。
  5. 分析结果:跟预期值对比。偏差超过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 的吞吐量。如果两者差距大,说明链路有丢包或拥塞。

我的习惯:基准测试结果一定要保存到文件里,标注好测试时间、网络拓扑、设备配置。这样以后回溯问题时,才有据可查。