Skip to content

IPv4 头字段详解 ​

🌐 IPv4 头 20 字节逐字段,r0capture 写 pcap 时构造。

头格式 ​

struct.pack('>BBHHHBBHII', ...)(大端,20 字节):

偏移字段字节r0capture 值
0version(4) + IHL(4)10x45(v4, 5×4=20字节头)
1DSCP+ECN10x00
2total length220+20+载荷
4identification20(不分片,不维护)
6flags(3)+fragment(13)20x4000(DF, 不分片)
8TTL10xFF(255)
9protocol16(TCP)
10header checksum20(假包不校验)
12src addr4message.src_addr
16dst addr4message.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) 生成)。

相关文档 ​

基于 VitePress 构建 · 教学用途