IPv6数据包的UDP校验和计算

时间:2015-06-16 04:44:22

标签: udp ipv6 checksum

我试图了解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 00 01 fd 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 个答案:

答案 0 :(得分:6)

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

您的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)的步骤。所有数字均以十六进制格式表示。

步骤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)

您的Psuedo标头的总和是:

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

步骤2)计算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

步骤3)计算总计

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

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

SUM_16BIT = 0x0002 + 0x8218
          = 0x821A

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

CHECKSUM  = 0x821A Xor 0xFFFF
          = 0x7ED5

您的校验和是0x7ED5

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

答案 1 :(得分:-3)

通过udp协议计算了解ipv6的明显示例 假设您有ipv6数据包的数据 60000000000C1120FD00C001C0DE0077007700FFFE000005FD00C001C0DE000100000000000000020FDB0328000CED1401020304 IPV6 HEADER 60000000 000C 11 20

IP标题部分PSEUDO标题(这是将UDP或协议链接到IPVX标题的部分,因此称为PSEDUO标题,它是真正的标题但是使链接变为BTWN 2)SRC和DSTN地址和协议以及我们将要添加的标准需要从IP头上提取LENTFTH以上0X000C和协议OX11

  

FD00C001C0DE0077007700FFFE000005

     

FD00C001C0DE00010000000000000002   UDP HEADER START   0FDB

     

0328

     

000C

     

ED14 CHECKSUM

DATA 0102 0304

参考RFC 2460(https://tools.ietf.org/html/rfc2460 :) IPv6伪标头 ////源地址是IPv6标头中的地址。目的地址是最终目的地;如果IPv6数据包不包含路由头,那将是IPv6头中的目标地址;否则,在始发节点,它将是Routing报头的最后一个元素中的地址,并且在接收节点处,它将是IPv6报头中的目标地址。 Next Header字段的值是UDP的协议值:17。UDP长度字段是UDP标头和数据的长度///

注意:ipv6标头没有校验和字段,因此必须使用udp或其他协议校验和才能获得正确的数据包 IPv6 Pseudo Header。=(源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

协议= 0x0011(udp)//必须包含 length = 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)