tcpdump —— 抓包与协议分析(网络问题的最终裁判)
这个工具是做什么的
把网卡上经过的每一个数据包按 BPF 过滤器抓下来,看报文的完整内容(TCP 头、载荷、标志位、序列号、重传)。ss 只能看连接状态"现在是怎样的",tcpdump 能看到"数据到底是怎么走的"——丢包、重传、乱序、对端不 ACK、半开连接这类问题,最终都要靠抓包定案。
可以回答什么问题
| 问题 | 怎么用 |
|---|---|
| 有没有丢包/重传? | -e tcp[tcpflags] & tcp-syn!=0 过滤;看 [TCP Retransmission] 标注 |
| 数据发出去对端收没收到? | 抓包看 Seq/Ack 是否在推进 |
| 连接建立/断开过程是否正常? | 抓 SYN/SYN-ACK/ACK 与 FIN/RST 序列 |
| RST 是谁发的、什么情况发的? | tcpdump 'tcp[tcpflags] & tcp-rst != 0' |
| 应用层发了什么内容? | -A 以 ASCII 显示载荷,-X 十六进制+ASCII |
| 慢是网络慢还是应用慢? | 看包到达间隔(-tttt)与服务端响应间隔 |
数据来源
- 来源接口:libpcap,从网卡驱动/内核的包处理路径拷贝报文副本(不干扰正常收发)。
- 采集方式:按 BPF 表达式在内核侧过滤(减少拷贝),命中者由 tcpdump 解码打印。
- 由此决定的特性:抓包在高速率下会丢包(用户态来不及处理,内核环形缓冲溢出),高流量时注意
tcpdump: ... dropped by kernel;默认只抓包头不抓载荷(-s 0抓全长);需要 root/CAP_NET_RAW。
一、基本用法
bash
yum install tcpdump / apt install tcpdump
tcpdump -i eth0 # 抓 eth0 全部包
tcpdump -i eth0 -n # -n 不反解域名/端口(更快,推荐)
tcpdump -i eth0 -nn # 端口也显示数字
tcpdump -i eth0 port 9988 # 按端口过滤
tcpdump -i eth0 host 1.2.3.4 # 按主机过滤
tcpdump -i eth0 'tcp and port 80' # BPF 组合过滤
tcpdump -i eth0 -s 0 -A # 抓全包 + ASCII 载荷
tcpdump -i eth0 -w cap.pcap # 存文件(后续用 Wireshark 分析)
tcpdump -r cap.pcap # 读文件
tcpdump -i eth0 -c 100 # 只抓 100 个包
tcpdump -i eth0 -tttt # 完整时间戳
tcpdump -i any port 9988 -v # -v 更详细二、常用 BPF 过滤表达式
| 表达式 | 含义 |
|---|---|
tcp[tcpflags] & (tcp-syn) != 0 | SYN(建连) |
| `tcp[tcpflags] & (tcp-syn | tcp-ack) == tcp-syn` |
tcp[tcpflags] & (tcp-rst) != 0 | RST(异常断开) |
tcp[tcpflags] & (tcp-fin) != 0 | FIN(正常关闭) |
tcp[13] & 8 != 0 | PSH 包(带载荷立即推) |
udp port 53 | DNS 查询 |
port 9988 and host 1.2.3.4 | 组合 |
三、输出解读
text
14:23:45.123456 IP 1.2.3.4.54321 > 5.6.7.8.9988: Flags [P.], seq 1:5, ack 1, win 4096, length 4
14:23:45.123789 IP 5.6.7.8.9988 > 1.2.3.4.54321: Flags [.], ack 5, win 8192, length 0| 字段 | 含义 |
|---|---|
Flags [P.] | P=PSH 带数据,.=ACK,S=SYN,F=FIN,R=RST |
seq 1:5 | 本包携带 1~5 字节序号 |
ack 5 | 确认收到对端到 5 之前的字节 |
win 4096 | 通告的接收窗口(对方可发多少) |
length 4 | 载荷字节数 |
四、判断口诀
| 现象 | 判读 |
|---|---|
同一 seq 反复出现 [TCP Retransmission] | 丢包/网络拥塞 |
大量 [TCP Dup ACK] | 丢包导致的快速重传 |
| 连接被 RST 立刻打断 | 对端拒绝/端口未监听/防火墙 |
| 发出请求后长时间无 ACK | 网络延迟或对端卡住 |
| ack 停止推进但持续发数据 | 对端应用不读(背压) |
⚠️ 注意事项:高速率抓包会丢包(留意
dropped by kernel);生产环境抓包前先评估流量;-n关闭反解、-s 0全包、-w存文件用 Wireshark 分析是黄金组合。
一句话总结:ss 看"连接状态现状",tcpdump 看"数据包实际走向"——丢包/重传/RST/背压这类问题,抓包是最可信的最终裁判。