首页/网络/网络排障速查/snaplen 与截断控制(-s)

snaplen 与截断控制(-s)

每个包只抓前 N 字节可大幅降低开销;默认 snaplen 足够看头部,需要看完整载荷时用 -s 0 抓全包,截断的包在输出里显示 [|tcp]。

网络排障速查网络更新于 2026-10-13

snaplen 与截断控制是什么

snaplen 是 tcpdump 对每个报文抓取的字节上限(由 -s 指定)。它直接决定抓包的三个属性:开销、文件大小与能看到的协议层次。默认值在现代 libpcap 里足以看清绝大多数头部,但在分析 TLS 握手细节或 HTTP 正文时必须显式抓全包。被截断的报文在输出里会显示 [|tcp]、[|http] 这样的标记,那是截断痕迹,不是报文损坏。

基本信息

适用平台Linux/Unix/macOS 的 tcpdump + libpcap
关键选项-s 指定字节数、-s 0 表示抓取完整报文
默认值现代 libpcap 默认 262144 字节,旧版本为 65535
判读标志[|tcp]、[|http] 等方括号标记表示被截断

典型使用场景

  • 高流量接口长时间抓取:用小 snaplen 只留头部,把开销压到最低
  • 分析 TLS 握手与证书:必须 -s 0,否则握手报文后半段被截
  • 导出给第三方分析:先确认对方需要的最大协议层,再定 snaplen
  • 磁盘受限的现场机:配合 -w 与 -C 轮转,用小 snaplen 延长可抓时长

snaplen 用法

snaplen 用法
# 只保留头部,开销最小,适合只看连接层
 sudo tcpdump -nn -i eth0 -s 96 -c 1000 port 33434
# 抓全包并直接打印正文,用于看 HTTP 明文内容
tcpdump -nn -i eth0 -s 0 -A 'tcp port 80'
# 存到文件,后续用 Wireshark 分析
 sudo tcpdump -nn -i eth0 -s 0 -w /tmp/full.pcap port 443
# 只抓一层封装的情况下留 1500 字节常常足够
tcpdump -nn -i eth0 -s 1500 -w /tmp/hdr.pcap port 443

取值建议

取值能看到的层次适用场景
96 字节以太网头 + IP + TCP/UDP 头只判连接与握手过程,开销最低
128-256 字节上述头部加少量载荷需要看到部分应用层标志位时
1500 字节单层封装下的完整以太网帧不含隧道封装的常规抓包
0(全包)完整报文含隧道内层与正文协议细节分析、TLS 与 HTTP 排查
分析 TLS 握手、HTTP 头之外的内容时必须用 -s 0;只做连接层判读时反而应该用小 snaplen,因为同样的磁盘空间能存下更多报文,长时间抓取的可用性更高。
在全速接口上用 -s 0 长时间抓取,磁盘写入与内存拷贝会同时飙升,可能影响同机业务:务必配合时长限制与过滤器,并优先写到独立磁盘或流式回传。

易错点

  • 看到 [|tcp] 以为报文损坏:那是 snaplen 截断标记,加大 -s 重抓即可
  • 全速链路用 -s 0 长时间抓:磁盘与 CPU 压力骤增,可能整机受影响
  • 误信『默认就是全包』:默认 snaplen 在多数版本下仍会截断大报文
  • 隧道环境按单层帧长设置 snaplen:外层加内层的总长超出上限,内层协议头被截掉
  • 把 snaplen 设得极小后又去看应用层内容:结论只能从残缺数据里得出,容易误判

数据来源与参考

  • man 8 tcpdump(-s snaplen)
  • pcap-savefile(5):抓包文件格式

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌