IPv4 头字段详解
🌐 IPv4 头 20 字节逐字段,r0capture 写 pcap 时构造。
头格式
struct.pack('>BBHHHBBHII', ...)(大端,20 字节):
| 偏移 | 字段 | 字节 | r0capture 值 |
|---|---|---|---|
| 0 | version(4) + IHL(4) | 1 | 0x45(v4, 5×4=20字节头) |
| 1 | DSCP+ECN | 1 | 0x00 |
| 2 | total length | 2 | 20+20+载荷 |
| 4 | identification | 2 | 0(不分片,不维护) |
| 6 | flags(3)+fragment(13) | 2 | 0x4000(DF, 不分片) |
| 8 | TTL | 1 | 0xFF(255) |
| 9 | protocol | 1 | 6(TCP) |
| 10 | header checksum | 2 | 0(假包不校验) |
| 12 | src addr | 4 | message.src_addr |
| 16 | dst addr | 4 | message.dst_addr |
version + IHL
0x45:
- 高 4 位
4= IPv4 - 低 4 位
5= 头长 5 个 32 位字 = 20 字节(无选项)
total length
整个 IP 包长度 = IP头(20) + TCP头(20) + 载荷。Wireshark 据此知道包边界。
identification
r0capture 填 0(不维护递增)。因为设了 DF 不分片,identification 不参与重组,填 0 即可。真实抓包工具会递增它,但 r0capture 的假包不需要。
flags
0x4000:
- bit 0(保留):0
- bit 1(DF, Don't Fragment):1
- bit 2(MF, More Fragments):0
- 后 13 位 fragment offset:0
TTL
0xFF = 255 跳。填最大值避免 Wireshark 把包当作"经过太多跳即将丢弃"。
protocol
6 = TCP。其他常见:17=UDP, 1=ICMP。
checksum
r0capture 填 0,不计算真实校验和。Wireshark 会显示"bad checksum"警告,但不影响明文查看。
地址
src_addr/dst_addr 是 4 字节大端二进制(由 struct.pack('>I', message.src_addr) 生成)。