我试图了解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。任何人都可以解释校验和是如何产生这种价值的吗?我想手动计算它来理解方法。
答案 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)