IPv6数据包的UDP校验和计算

4
我正在尝试理解IPv6中UDP校验和的计算方法。
我有这个数据包:
IPv6头是 - 60 00 00 00 00 0c 11 fd 21 00 00 00 00 00 00 01 ab cd 00 00 00 00 00 01 fd 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 60
UDP头是 - 26 92 26 92 00 0c 7e d5
数据是 - 12 34 56 78
根据校验和计算,校验和为7ed5。有人能解释一下校验和如何得出该值吗?我想手动计算以了解该方法。
2个回答

14

如果这个问题还没有被回答,为了让其他人也受益。

你的IPv6数据包UDP数据包(以十六进制格式)

60 00 00 00 . 00 34 11 01 . 21 00 00 00 - `....4..!...
00 00 00 01 . AB CD 00 00 . 00 00 00 01 - ............
FD 00 00 00 . 00 00 00 00 . 00 00 00 00 - ............
00 00 01 60 . 26 92 26 92 . 00 0C 7E D5 - ...`&.&...~.
12 34 56 78                             - .4Vx

计算UDP头部中校验和(0x7ED5)的步骤。所有数字均以十六进制格式表示。

第一步)计算伪头部的16位和。伪头部包括源IP、目标IP、协议、UDP/TCP长度(头部+正文)

Source IP: 21 00 00 00 . 00 00 00 01 . AB CD 00 00 . 00 00 00 01
Dest   IP: FD 00 00 00 . 00 00 00 00 . 00 00 00 00 . 00 00 01 60
Protocol : 00 11  (UDP)
Proto Len: 00 0C  (UDP Header + Body)

您的伪标题总和是:

SUM_PHDR = 0x2100 + 0x0000 + ... + 0x0011 + 0x000C
         = 0x1CB4C

第二步)计算UDP头部和数据(不包括校验和)的16位和

UDP Hdr  : 26 92 26 92 . 00 0C 00 00
UDP Body : 12 34 56 78

您的UDP部分的总和为:

SUM_BODY = 0x2692 + 0x2692 + ... + 0x5678
         = B5DC

第三步) 计算总数

SUM_TOTAL = SUM_PHDR + SUM_BODY
          = 0x1CB4C + 0xB5DC
SUM_TOTAL = 0x28128  (or 0x00028128)

第四步)从总和计算16位校验和(因为它大于0xFFFF)

SUM_16BIT = 0x0002 + 0x8218
          = 0x821A

第五步) 计算16位和的补码

CHECKSUM  = 0x821A Xor 0xFFFF
          = 0x7ED5

您的校验和为0x7ED5。

步骤与IPv4相同,唯一不同的是伪头部中源IP和目的IP的长度(在第一步中)。


1
对于第4步,0x28128不应该是0x0002 + 0x8128的16位和吗? - user13233805
@AkaCoder404 - 不,0x0002 + 0x8218 = 0x821a - vy32
谢谢!我发现我的计算方法是错误的,因为我错误地将伪标头中的UDP长度与32位整数相加。 - ZHAN LU

-3

清晰易懂的示例,以理解使用UDP协议计算IPv6 假设您有IPv6数据包的数据如下: 60000000000C1120FD00C001C0DE0077007700FFFE000005FD00C001C0DE000100000000000000020FDB0328000CED1401020304 IPv6 HEADER 60000000 000C 11 20

IP HEADER PART PSEUDO HEADER(它是将UDP或协议链接到IPVX头部的部分,因此称为PSEDUO HEADER,它不是真正的头部,但在两者之间建立链接)SRC和DSTN地址和协议和长度要添加我们必须从IP HEADER LENTFTH中提取以上是0X000C和协议OX11

FD00C001C0DE0077007700FFFE000005

FD00C001C0DE00010000000000000002 UDP HEADER START 0FDB

0328

000C

ED14 CHECKSUM

数据 0102 0304

参考 RFC 2460(https://www.rfc-editor.org/rfc/rfc2460:) IPv6 伪头部 ////源地址是 IPv6 头部中的地址。目标地址是最终目的地;如果 IPv6 数据包不包含路由头,则为 IPv6 头部中的目标地址;否则,在起始节点,它将是路由头中最后一个元素中的地址,在接收节点,它将是 IPv6 头部中的目标地址。下一个头字段的值是 UDP 的协议值:17。UDP 长度字段是 UDP 头和数据的长度///

注意:IPv6 头没有校验和字段,因此必须在其中使用 UDP 或其他协议校验和以获得正确的数据包。 IPv6 伪头部 =(源 IP、目标 IP、协议、UDP/TCP 长度(头+正文)) 选择源地址并将其设置为 16 位 FD00:C001:C0DE:0077:0077:00FF:FE00:0005 或简写为 FD00:C001:C0DE:77:77:FF:FE00:5 与目标地址相同 FD00:C001:C0DE:1::2

协议 = 0x0011(udp) //必须包含 长度 = 0x000c //

UDP头有: 源端口(16位)= 0x0fdb 目标端口0x0328 长度 = 0x000c 校验和(待计算)所以考虑 = 0x0000

数据组为(16位)0x0102、0x0304......注意:如果是奇数,假设为05,则将其视为0x0500

这里的校验和将是伪头+UDP头+数据的16位总和 伪头总和= 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

发射机校验和将是信息伪头部、IP头部、UDP头部和数据的一补数和的16位一补数,末尾填充零八位(如果需要)以形成两个八位的倍数。[7]

因此,在这里1的补码将是0X12EB XOR 0XFFFF = 0XED14(校验和)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接