必须使用-s 0参数捕获完整载荷,否则默认截断会导致[|tcp]等标记;再配合-A或-X选项查看明文内容,但HTTPS等加密流量仅显示密文。

要查看数据包完整载荷,核心是捕获时不截断 + 输出时正确解码。默认情况下 tcpdump 只抓前 68 或 262144 字节,大包(如含 HTTP body、TLS 应用数据、JSON 响应)极易被截断,导致输出中出现 [|tcp]、[|ip] 这类标记——说明载荷缺失,无法看到真实内容。
-s 0 是获取完整载荷的前提
必须显式加 -s 0,告诉 tcpdump 不限制每个包的捕获长度:
- 它会按系统支持的最大值(通常是 65535 字节)抓取整个 IP 包载荷
- 没有
-s 0,即使后续用-A或-X,看到的也只是被砍掉的片段
示例命令:
sudo tcpdump -i eth0 -s 0 port 80 -w http-full.pcap sudo tcpdump -i lo -s 0 -A port 3000
用 -A 或 -X 实时查看明文载荷
-
-A:以纯 ASCII 显示,适合快速扫 HTTP 请求行、Header、JSON、SQL 等可读文本 -
-X:十六进制 + ASCII 双列显示,能看清不可见字符、字段边界、协议结构(比如 DNS 查询名偏移)
注意:这两个选项只对明文协议有效(HTTP、DNS、SMTP、Redis、MQTT without TLS 等)。HTTPS/TLS 流量即使 -s 0,也只显示加密密文(Client Hello 等握手阶段除外)。
验证是否真“完整”
别光看命令写了 -s 0,要确认结果:
- 实时输出中没有
[|tcp]、[|ip]、[|http]等截断标记 - 用 Wireshark 打开
.pcap文件 → 右键某 TCP 流 → Follow → TCP Stream → 内容连续无...或[truncated] - 对比 Wireshark 中每包的 “Length” 列数值,确保全部 ≤ 你设置的
-s值(若设-s 0,实际上限由内核决定,通常够用)
加过滤减少干扰,聚焦目标
载荷完整 ≠ 全量抓包。建议配合 BPF 过滤器:
- 只看某服务:
port 8080 and host 192.168.1.100 - 只抓 HTTP GET:
tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420) - 分离方向:
src host 10.0.2.15 and port 443(客户端发的 TLS 流量)
不复杂但容易忽略


















