游客发表
你敲下 tcpdump -i eth0,抓包屏幕上开始滚动密密麻麻的命令网络报文。这一刻,抓包你不再是命令普通的程序员,而是抓包趴在网线上的窃听者。tcpdump就是命令Linux世界里最直接的抓包工具,没有图形界面,抓包没有花哨仪表盘,命令一个命令行窗口就能把网络上流动的抓包每一个字节都看个清清楚楚。
最常用的命令组合拳是 tcpdump -i any -nn -s0 -w /tmp/capture.pcap。这里 -i any 监听所有网卡,抓包-nn 不做域名和端口解析(否则DNS查询会拖慢抓包速度),命令-s0 抓取完整包而非只抓头部,抓包-w 把原始数据写进文件。命令抓完文件后,抓包用 tcpdump -r capture.pcap -nn 回放分析,或者干脆丢给Wireshark做可视化。这套流程我用了十年,从未失手。
但真正让tcpdump强大的是它的过滤语法。光会抓包不叫本事,能在海量流量里瞬间捞出目标才算入门。比如排查HTTP延迟问题,直接 tcpdump -i eth0 tcp port 80 and host 192.168.1.100,立刻只看见那台机器和80端口的交互。想更细一点,加 tcp[13] & 2 != 0 只抓SYN包——这是TCP三次握手的起点,排查连接建立失败时这个过滤器能救命。
记得有次线上服务偶发超时,业务日志看不出异常。我直接在服务器上跑 tcpdump -i eth0 tcp and host 10.0.0.5 and port 8080 -nn -c 100,抓到100个包就自动停。结果发现客户端发了SYN后,服务端回了SYN-ACK,但客户端迟迟不送ACK。顺着时间戳一查,原来是客户端所在机房的防火墙对某些分片包做了丢包策略。要是没有tcpdump,这问题估计得排查一整天。
另一个实用技巧是输出时间戳精度。默认时间戳只到秒,排查毫秒级延迟时得加 -tttt 显示完整日期和微秒。配合 tcpdump -tttt -nn -i eth0 tcp port 443,你能精确看到每个TLS握手报文间隔,如果客户端Hello和服务端ServerHello之间差了200ms,那多半是网络路径上某个节点在磨蹭。
tcpdump还能直接解析应用层内容。比如 tcpdump -A -i eth0 tcp port 80 会把HTTP报文以ASCII形式打出来,虽然格式混乱,但偶尔调试API联调时,能直接看到POST的JSON数据体——当然,生产环境别这么干,明文密码会直接暴露在终端上。
最后说个反直觉的细节:tcpdump自身也可能成为瓶颈。当流量超过网卡处理能力时,抓包进程会丢包,屏幕会显示 kernel: packet capture buffer overflow。这时别慌,加 -B 4096(把内核缓冲区从默认2MB提到4MB)通常能缓解。如果还是丢,就得考虑用 taskset -c 2 tcpdump 把进程绑定到特定CPU核上,减少调度延迟。
抓包这事,干得多了你会发现,网络故障八成不在代码逻辑上,而在那些被防火墙、负载均衡器悄悄改动的TCP参数里。tcpdump就是照妖镜,让所有隐藏在网络层的小动作现出原形。别怕命令行黑屏,敲上几条过滤规则,你就能看见数据在网线里奔跑的真实轨迹。
友情链接