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 长时间抓取,磁盘写入与内存拷贝会同时飙升,可能影响同机业务:务必配合时长限制与过滤器,并优先写到独立磁盘或流式回传。