用 Linux 嗅探器检测网络延迟的实操指南
一、方法总览与适用场景
- 使用 tcpdump 在服务器侧精准抓包,保存为 .pcap/.pcapng,再用 Wireshark 做时序与统计可视化分析,适合定位 ICMP/HTTP/TCP 等真实业务延迟。
- 通过 TCP 时间戳(RFC 1323) 估算链路 RTT,可在不依赖应用日志的情况下判断延迟发生在网络还是主机处理。
- 结合 tshark 导出时间戳做批量统计,适合自动化巡检与趋势分析。
二、准备工作与关键配置
- 安装工具:在两端安装 tcpdump/wireshark(或仅服务器侧 tcpdump,分析端用 Wireshark)。
- 时间同步:所有相关主机启用 NTP,避免时钟漂移导致时延判断失真。
- 开启 TCP 时间戳:确保 net.ipv4.tcp_timestamps=1(Linux 默认多为开启),以便用 TCP 时间戳估算 RTT。
- 高精度捕获:Wireshark/抓包驱动启用 微秒级 时间戳,提高小延迟测量精度。
三、用 tcpdump 抓包的关键命令
- 抓取目标主机的 ICMP(ping)往返时延
- 命令:tcpdump -i eth0 -nn -tttt icmp and host 1.2.3.4
- 要点:用 -tttt 输出绝对时间,计算请求与应答的时间差即为 RTT。
- 抓取 HTTP 请求-响应的总耗时
- 命令:tcpdump -i eth0 -s 0 -w http.pcap ‘tcp port 80’
- 要点:-s 0 抓全包;在 Wireshark 中按流查看请求发出到首响应到达的时间差。
- 抓取 TCP 三次握手并观察握手 RTT
- 命令:tcpdump -i eth0 -nn -tttt ‘tcp[tcpflags] & (tcp-syn|tcp-ack) != 0’
- 要点:测量 SYN → SYN-ACK 的时间差,反映网络往返时延的上界。
- 抓取并限制规模,便于分析
- 命令:tcpdump -i eth0 -c 2000 -w capture.pcap ‘host 1.2.3.4 and port 80’
- 要点:用 -c 限制包数,避免磁盘占满。
四、用 Wireshark 精确度量与定位
- 导入抓包后,按业务流过滤(如 http 或 ip.addr==x.x.x.x && tcp.port==80),使用 “Follow → TCP Stream” 查看请求/响应边界。
- 添加列:右键列头 → 列首选项 → 添加 Delta Time/Time Delta,快速发现突发延迟点。
- 关键时延点
- 握手 RTT:测 SYN → SYN-ACK 间隔,若偏大,多为网络路径问题。
- 首字节时间(TTFB):测 GET 请求头 → 首个 HTTP 响应数据 间隔,反映服务器处理+网络回传。
- ACK 延迟:服务器/客户端 ACK 滞后 常见于应用处理慢或 Nagle 与延迟确认 叠加。
- 可视化与统计
- Statistics → Flow Graph:查看握手、请求、响应的时序链路。
- Statistics → TCP Stream Graph → RTT:观察 RTT 分布与异常尖峰。
- IO Graphs:定位延迟与丢包/重传的时段对应关系。
五、进阶 用 TCP 时间戳估算 RTT 并判定延迟归属
- 原理:启用 TCP 时间戳 后,每个报文携带 TSval,回显在 TSecr。同一方向的相邻报文时间戳增量可视为本机时钟的步进;跨方向的 TSecr 差值可近似为 链路 RTT。
- 示例(Wireshark/tshark 观察)
- 条件:捕获到客户端→服务端的数据包序列,且两端均开启 tcp_timestamps=1。
- 操作:在时序中选取相邻请求/响应的 TSval/TSecr,计算 ΔTS = TSecr_response − TSecr_request;若 ΔTS 与捕获时间差接近,说明延迟主要在网络;若 ΔTS 很小而捕获时间差很大,多为端点处理慢。
- 判定思路
- 握手阶段 SYN/ACK 的 RTT 就很大:多为中间设备/链路问题。
- 握手很快,但 GET/首数据 阶段延迟大:多为服务器处理或服务器侧队列/协议栈(如 Nagle)影响。
- 大量 ACK 延迟、重复 ACK/重传:多为拥塞或链路不稳定。