IPv6数据包的UDP校验和计算

bai*_*ila 1 checksum udp ipv6

我试图了解IPv6的UDP校验和计算方法.对于IPv4数据包,我找到了这个链接 - http://www4.ncsu.edu/~mlsichit/Teaching/407/Resources/udpChecksum.html.我有一个包:


IPv6标头是 - 60 00 00 00 00 0c 11 fd 21 00 00 00 00 00 00 01 ab cd 00 00 00 00 01 01 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.任何人都可以解释校验和是如何产生这种价值的吗?我想手动计算它来理解方法.

小智 7

如果这个问题尚未得到回答,并且为了他人的利益.

您的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
Run Code Online (Sandbox Code Playgroud)

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

步骤1)计算Psuedo Header的16位和.Psuedo标头包含源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)
Run Code Online (Sandbox Code Playgroud)

您的Psuedo标头的总和是:

SUM_PHDR = 0x2100 + 0x0000 + ... + 0x0011 + 0x000C
         = 0x1CB4C
Run Code Online (Sandbox Code Playgroud)

步骤2)计算UDP头部+数据的16位总和(不包括校验和)

UDP Hdr  : 26 92 26 92 . 00 0C 00 00 
UDP Body : 12 34 56 78
Run Code Online (Sandbox Code Playgroud)

UDP部分的总和是:

SUM_BODY = 0x2692 + 0x2692 + ... + 0x5678
         = B5DC
Run Code Online (Sandbox Code Playgroud)

步骤3)计算总计

SUM_TOTAL = SUM_PHDR + SUM_BODY
          = 0x1CB4C + 0xB5DC
SUM_TOTAL = 0x28128  (or 0x00028128)
Run Code Online (Sandbox Code Playgroud)

步骤4)从总计算16位和(因为它> 0xFFFF)

SUM_16BIT = 0x0002 + 0x8218
          = 0x821A
Run Code Online (Sandbox Code Playgroud)

步骤5)计算一个16位和的赞美

CHECKSUM  = 0x821A Xor 0xFFFF
          = 0x7ED5
Run Code Online (Sandbox Code Playgroud)

你的校验和是0x7ED5

该过程与IPv4相同.不同之处仅在于psuedo标头中的源IP和目标IP的长度(在步骤1中).