tcpdump是排查网络吞吐异常最直接的底层工具,通过精准抓包比对、识别重传风暴、窗口缩限和小包泛滥等现象,定位接口方向异常与协议层真实瓶颈。

tcpdump 是排查网络吞吐异常最直接、最底层的工具之一。它不依赖高层统计抽象,而是直击原始数据包,能帮你确认“流量到底有没有、发没发错、收没收到、是不是被截断或重传”。关键不在抓多少包,而在抓得准、看得清、比得明。
锁定异常接口与方向
吞吐异常往往表现为某接口收/发速率骤降或飙升,先确认问题落在哪张网卡、哪个方向:
- 用 sar -n DEV 1 5 快速查看各接口实时收发速率(rxkB/s、txkB/s),定位异常接口名(如 ens33、docker0)
- 运行 tcpdump -i ens33 -c 100 -w baseline.pcap 抓一小段基线流量,再在业务卡顿时再抓一段对比
- 若怀疑单向丢包,可分别在两端主机上同时抓包:一端抓 -i eth0 src host A.ip,另一端抓 -i eth0 dst host A.ip,比对包数是否一致
识别吞吐瓶颈的真实原因
高吞吐≠健康;低吞吐也不等于链路断。tcpdump 能揭示表象下的协议层问题:
- 重传风暴:执行 tcpdump -i any 'tcp[tcpflags] & (tcp-rst|tcp-syn|tcp-fin) != 0 or tcp[12] & 0x80 != 0' -nn,重点看大量 [RST] 或重复 [ACK] 序列号,说明存在连接异常中断或拥塞丢包
- 窗口缩限:用 tshark -r trace.pcap -T fields -e tcp.window_size -e tcp.window_size_scalefactor(或 wireshark 打开 pcap 后追踪流 → 右键 “Follow → TCP Stream”)观察接收窗口是否持续为 0 或极小值,反映远端应用读取缓慢或缓冲区满
- 小包泛滥:tcpdump -i eth0 -w smallpkts.pcap 'ip[2:2] 捕获长度小于 128 字节的 IP 包,若占比过高(尤其非 ACK 包),可能因 Nagle 算法关闭不当或应用频繁短写导致效率下降
关联进程与流量行为
吞吐异常常源于某个进程行为失常(如日志刷屏、心跳过频、连接泄漏)。tcpdump 本身不显示进程名,但可交叉验证:
- 先用 lsof -iTCP -sTCP:ESTABLISHED -Pn 找出所有活跃 TCP 连接及对应 PID
- 对可疑 PID,用 ss -tulpn | grep :PORT 或 cat /proc/PID/fd/ | grep socket 确认其监听/连接端口
- 再针对性抓该端口流量:tcpdump -i any 'port 8080' -w app8080.pcap,结合 strace -p PID -e trace=sendto,recvfrom 观察系统调用频次与数据量是否匹配
- 若发现某进程持续发送小包但无有效 payload,大概率是健康检查误配、SDK 自动重连或逻辑缺陷
保存与对比分析技巧
单次抓包价值有限,关键是可复现、可比对、可量化:
- 用 -G 60 -W 5 参数循环写入多个 60 秒文件:tcpdump -i eth0 -G 60 -W 5 -w hourly_%Y-%m-%d_%H:%M.pcap
- 用 capinfos 查看每个 pcap 的包数、平均包长、时间跨度:capinfos hourly_*.pcap | grep -E "(File|Packets|Data|Duration)"
- 用 tshark -r trace.pcap -qz io,stat,1 生成每秒 I/O 统计,导出 CSV 后用 Excel 或 gnuplot 绘图,直观定位吞吐突变时刻











