IPv4协议首部校验位算法实现
记录一哈, 嗅探路由数据转发的需求, 需要对IPv4的校验位进行重新计算填充.
特此记录下IPv4协议求和校验位的算法实现.
IPv4与Ipv6的首部区别
Ipv4协议包含首部校验和字段等信息, 导致路由转发时需要进行重新计算, 增加了延时成本, 在IPv6中取消了对应的校验和字段.
IPv4 数据包结构
这里用Wireshark随便抓个包看下Network Layer的Packet.
这里看到IPv4 首部的Packet
版本: 4
首部长度: 20字节
服务类型TOS: 0
报文总长度: 1440字节
生存时间TTL: 49
协议类型: TCP
首部校验和: 0x0bc2
源IP地址: 140.249.34.22
目标IP地址: 192.168.1.101
Packet首部数据:
45 00 05 a0 c7 79 40 00 31 06 [0b c2] 8c f9 22 16 c0 a8 01 65
阐述下校验和的算法实现
- 在发送数据时,为了计算数IP据报的校验和, 需要把校验位置0. 即
0x0bc2 => 0x0000
Packet首部数据:
45 00 05 a0 c7 79 40 00 31 06 [00 00] 8c f9 22 16 c0 a8 01 65
首部以16位(2字节 无符号Short数据类型 )为单位划分, 进行求和
Packet首部数据:
4500 05a0 c779 4000 3106 [0000] 8cf9 2216 c0a8 0165
0x4500
+0x05a0
+0xc779
+0x4000
+0x3106
+0x0000 => header-checksum 已经重置为0
+0x8cf9
+0x2216
+0xc0a8
+0x0165
=0x2f43b
- 由于校验位为两个字节,
0x2f43b
高位2
溢