首页/网络/抓包与流量分析速查/tcpdump -s 设置抓取长度

tcpdump -s 设置抓取长度

设置每个报文抓取(保存)的字节数。抓完整包用 -s 0;只想看头部省空间可设 -s 128 之类;抓载荷内容必须 -s 0。

-s 在做什么

-s 设置每个报文最多抓取多少字节,也就是快照长度。抓完整报文写 -s 0;只关心头部、想节省空间时可以给一个较小的值。这个选项直接决定事后能分析到什么程度:被截断的报文里没有完整的应用层载荷,TLS 握手内容、HTTP 请求体都会缺失,而且无法恢复。各版本默认值不一致,排查应用层问题时显式写 -s 0 是最省心的做法。

基本信息

语法tcpdump -s <字节数>,-s 0 表示不截断
默认值各版本不同,不能想当然认为默认就是完整
影响面只影响写入文件的字节数,不影响过滤是否命中
代价抓全量会显著放大文件体积与磁盘写入量
推荐应用层排查一律 -s 0

典型使用场景

  • 排查应用层内容问题:必须抓完整载荷,否则关键字段缺失
  • 高流量口长时间抓包:用较小的快照长度换取更长的抓包时间
  • 只看连接与握手行为:头部信息足够,截断能省大量空间
  • 分析 TLS 握手:截断会让证书与扩展字段不完整,需要完整快照
  • 估算磁盘占用:按包数与平均长度推算,决定是否加过滤条件

常用示例

常用示例
tcpdump -i any -s 0 -w /tmp/full.pcap port 3306      # 完整载荷,排查应用层
tcpdump -i eth0 -s 0 -nn -A 'tcp port 80'            # 完整载荷并直接看文本
tcpdump -i eth0 -s 96 -nn 'tcp[tcpflags] & tcp-syn != 0'   # 只看握手头部
tcpdump -i eth0 -s 128 -w /tmp/small.pcap port 443   # 折中:抓头部省空间
capinfos /tmp/full.pcap                              # 核对是否出现截断标记

快照长度参考

取值覆盖范围适用判断
0完整报文,不截断应用层排查、TLS 握手分析、抓 HTTP 内容
64 到 96以太网头、IP 头与 TCP 基本头只看连接与标志位,快速统计
128 左右头部加部分 TCP 选项折中方案,可以省空间但仍能看握手细节
几百字节部分载荷不确定时不要选这种中间值,容易被截断误导
默认值因版本而异生产排查不要依赖默认,明确写出取值
被截断的报文在分析工具里会显示长度受限提示,用户数据部分不可读。看到这类提示基本可以判断当时的快照长度设置偏小,需要重抓而不是猜测内容。
抓完整报文会让文件体积明显增大。在高流量接口上不加过滤条件全量抓取,几分钟就能写满磁盘,务必同时使用过滤条件、数量上限或环形分卷。

体积与截断核对

体积与截断核对
capinfos -c -s /tmp/full.pcap        # 看包数与文件大小,估算平均长度
tshark -r /tmp/full.pcap -Y 'frame.cap_len < frame.len' | head   # 快速找出被截断的报文
ls -lh /tmp/*.pcap                   # 对照实际占用与预留空间

判读要点

  • 怀疑应用层内容缺失时先确认是不是截断造成的,而不是先怀疑应用没有发送
  • 同一批抓包文件里混用了不同快照长度,分析时要注意对比条件是否公平
  • 排查 TLS 握手问题必须抓完整,截断后的证书字段无法用于判断
  • 长时间抓包的分卷文件如果快照长度太小,事后想复核内容只能重抓

易错点

  • 依赖默认快照长度做应用层分析,事后发现载荷缺失且无法恢复
  • 为了省空间把快照长度设得过小,结果连 TCP 选项都被截断,握手细节看不出来
  • 全量抓取又不加过滤条件,高流量下很快写满磁盘并导致抓包中断
  • 只关注过滤表达式而忽略快照长度,明明条件正确却看不到内容
  • 同类问题前后两次抓包用了不同快照长度,对比结论不成立

数据来源与参考

  • man 8 tcpdump(-s 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌