首页/网络/抓包与流量分析速查/tcpdump -X 十六进制与 ASCII 对照

tcpdump -X 十六进制与 ASCII 对照

同时打印报文的十六进制与 ASCII 内容,用于核对二进制字段(如 TCP 选项、DNS 头部、TLS 记录头)的真实取值。

十六进制视图是干什么的

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 与十六进制文本,便于他人复核
把两端抓到的同一报文十六进制放在一起比对,能快速发现中间设备是否改写过字段。

易错点

  • 忘记 -s 0 导致只看到包头与少量载荷,误判为「对端没发数据」
  • -X 输出很宽,在窄终端里会被折行破坏对齐,仍要逐字节分析时建议落盘后交给 Wireshark
  • 把 -X 与 -XX 的差异记混:需要看 MAC 头、VLAN 标签时只有 -XX 才够

数据来源与参考

  • man 8 tcpdump(-X/-XX 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌