十六进制视图是干什么的
tcpdump 默认把报文解码成一行可读摘要,遇到解码器不认识的字段就只能看十六进制。加 -X 后每个包额外打印 hex 与 ASCII 两栏,适合核对二进制字段的真实取值:TCP 选项区、DNS 报文头、TLS 记录头、私有协议字段。加 -XX 则连链路层帧头一起打印,用于排查二层问题。
基本信息
| 适用平台 | Linux / macOS / BSD 上的 libpcap 版 tcpdump |
|---|---|
| 语法 | tcpdump -X [选项] [过滤表达式] |
| 增强写法 | -XX 连链路层头一起打印 |
| 配套选项 | -s 0 抓完整包、-c N 限量、-nn 不解析名字 |
| 权限 | 读原始套接字需要 root 或 CAP_NET_RAW |
典型使用场景
- 核对 TCP 选项字节:MSS、窗口缩放、SACK 是否真的协商上了
- 查看 DNS 事务 ID 与标志位,确认应答是否为同一事务
- 核对私有协议或在研协议的自定义字段取值
- 在只有命令行没有图形工具的服务器上做一次性取证
常用示例
常用示例
tcpdump -i eth0 -nn -s 0 -X -c 5 'tcp port 53' # 抓 5 个 DNS 包并对照 hex 与 ASCII
tcpdump -nn -XX -r dns.pcap -c 2 # 离线重放并连链路层头一起打印
tcpdump -i eth0 -nn -A -s 0 port 80 # 只要 ASCII 时可用 -A 替代 -X
tcpdump -i eth0 -nn -X 'tcp[13] & 2 != 0' -c 3 # 只看 SYN 包的原始字节两栏怎么读
| 区块 | 含义 | 读法 |
|---|---|---|
| 行首偏移量 | 该行首字节在报文中的位置 | 每行固定 16 字节,便于按偏移定位字段 |
| hex 栏 | 原始字节 | 按协议字段宽度两两一组解读 |
| ASCII 栏 | 同字节的可打印映射 | 不可打印字符显示为点号 |
| 不足 16 字节的尾行 | 报文余下的字节 | 长度由实际包长决定 |
TCP 标志位在 hex 里很直观:0x12 是 SYN-ACK、0x11 是 FIN-ACK、0x10 是纯 ACK。
要打印完整载荷必须加 -s 0,否则只能看到被默认 snaplen 截断的那一段。
进阶要点
- 对照协议规范逐字段核对偏移,比凭感觉猜字节更可靠
- 私有协议先抓一份已知正确的报文作为基准,再与异常报文比对差异字节
- 十六进制比对适合定位字段级差异,批量分析交给 tshark 更省力
- 只看可打印内容用 -A,需要两栏对照用 -X,按用途选择即可
- 关键取证样本同时留存 pcap 与十六进制文本,便于他人复核
把两端抓到的同一报文十六进制放在一起比对,能快速发现中间设备是否改写过字段。