用udp协议计算理解ipv6的清晰例子
假设您有 ipv6 数据包的数据为
60000000000C1120FD00C001C0DE0077007700FFFE000005FD00C001C0DE000100000000000000020FDB0328000CED1401020304
IPV6 标头
60000000 000C 11 20
IP 报头部分伪报头(它是将 UDP 或协议链接到 IPVX 报头的部分,因此将其命名为伪报头,但它不是真正的报头,但要在 BTWN 2 处建立链接)SRC 和 DSTN 地址和协议以及我们要添加的长度必须从 IP 报头 LENTFTH 以上是 0X000C 和协议 OX11 中提取
FD00C001C0DE0077007700FFFE000005
FD00C001C0DE000100000000000000002
UDP 报头开始
0FDB
0328
000C
ED14 校验和
数据
0102 0304
参考 RFC 2460(https://www.rfc-editor.org/rfc/rfc2460:)
IPv6 伪标头
////源地址是IPv6标头中的地址。目的地址为最终目的地;如果 IPv6 数据包不包含 Routing 报头,那将是 IPv6 报头中的目标地址;否则,在始发节点,它将是路由报头最后一个元素中的地址,而在接收节点,它将是 IPv6 报头中的目标地址。 Next Header字段的值是UDP的协议值:17。UDP长度字段是UDP头和数据的长度///
注意:ipv6 标头没有校验和字段,因此必须在其中包含 udp 或其他协议校验和才能正确数据包
IPv6 伪报头。=(源 IP、目标 IP、协议、UDP/TCP 长度(报头+正文))
选择 src 地址并将其设置为 16 位 FD00:C001:C0DE:0077:0077:00FF:FE00:0005 或短至 FD00:C001:C0DE:77:77:FF:FE00:5
同目的地址FD00:C001:C0DE:1::2
Protocol = 0x0011(udp) // 必须包含
长度 = 0x000c //
udp 标头有
源端口(16 位)= 0x0fdb
dstn 端口 0x0328
长度 = 0x000c
校验和(待计算)所以考虑 = 0x0000
数据组为(16bit) 0x0102,0x0304...注意:如果奇数假设05也将其作为0x0500
这里的校验和 = 16 位伪头 + udp 头 + 数据的总和
伪报头之和= FD00+C001+C0DE+0077+0077+00FF+FE00+0005+(FD00+C001+C0DE+1+2)+x0011+0x000c
伪头的总和= 5fbd0(16位总和可以在这里或每一步之后或最后一个结果将相同)
udp 头的总和 = 0x0fdb+0x0328+0x000c+0x0000+0x000 = 0x130f
数据总和 = 0x0102+0x0304 = 0x0406
所有 5fbd0+0x130f+0x0406 = 0x612e5 的总和
通过将 5 位相加得到 16 位和 = 0X12E5+6 = 0X12EB
TRANSMITTER CHECKSUM 将是来自 IP 报头、UDP 报头和数据的伪报头信息的补码和的 16 位补码,最后用零八位字节填充(如有必要)以生成两个八位字节的倍数。[7]
所以这里的 1,S 补码将是 0X12EB XOR 0XFFFF = 0XED14 (CHEKSUM)