pcap 全局头字段
📋 pcap 文件全局头(24 字节)每个字段的含义。
全局头结构
r0capture 在 ssl_log 里写 pcap 全局头:
python
for writes in (
("=I", 0xa1b2c3d4), # Magic number
("=H", 2), # Major version
("=H", 4), # Minor version
("=i", time.timezone), # GMT correction
("=I", 0), # Timestamp accuracy
("=I", 65535), # Snap length
("=I", 228)): # Data link type
pcap_file.write(struct.pack(writes[0], writes[1]))字段详解
| 偏移 | 长度 | 格式 | 值 | 含义 |
|---|---|---|---|---|
| 0 | 4 | =I | 0xa1b2c3d4 | Magic number + 字节序标记 |
| 4 | 2 | =H | 2 | 主版本 |
| 6 | 2 | =H | 4 | 次版本(即 pcap 2.4) |
| 8 | 4 | =i | time.timezone | GMT 到本地时区偏移秒数 |
| 12 | 4 | =I | 0 | 时间戳精度(0=微秒) |
| 16 | 4 | =I | 65535 | 单包最大保存长度 |
| 20 | 4 | =I | 228 | Data link type(228=LINKTYPE_IPV4) |
Magic Number
0xa1b2c3d4 是 pcap 的身份证:
- 写端用本机序写,小端机写出
d4 c3 b2 a1 - 读端读前 4 字节判断字节序:
a1 b2 c3 d4→ 写端大端d4 c3 b2 a1→ 写端小端
r0capture 在 x86(小端)上运行,写出 d4 c3 b2 a1,Wireshark 据此判定小端。
Link Type 228
228 = LINKTYPE_IPV4:告诉读端,每条记录体直接就是 IPv4 包(无以太网头)。这与 log_pcap 拼的「IPv4头+TCP头+载荷」结构对应。
为什么不用以太网头
r0capture 造的是假包,没必要加 14 字节以太网头(还要编 MAC 地址)。直接从 IPv4 开始更简洁,linktype 228 正是为此设计。
Snap Length
65535:单包最大保存长度。r0capture 不截断包,明文多大写多大(受限于这个上限)。