首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IPv6包的UDP校验和计算

IPv6包的UDP校验和计算
EN

Stack Overflow用户
提问于 2015-06-16 04:44:21
回答 2查看 10.5K关注 0票数 4

我试图理解IPv6的UDP校验和计算方法。

我有一个包裹:

IPv6标头为- 60 00 00 00 C 11 fd 21 00 00 00 01 ab cd 00 00 00 01 fd 00 00 00 UDP报头为- 26 92 26 92 00 C 7e d5 数据为- 12 34 56 78

根据校验和计算,校验和为7ed5。有人能解释一下校验和是如何得到这个值的吗?我想手工计算它来理解这个方法。

EN

回答 2

Stack Overflow用户

发布于 2015-10-14 19:03:10

如果这个问题还没有得到回答的话,这是为了其他人的利益。

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

代码语言:javascript
运行
复制
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)计算伪头的16位和。伪头包含源IP、目标IP、协议、UDP/TCP长度(header+body)

代码语言:javascript
运行
复制
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)

伪头的和是:

代码语言:javascript
运行
复制
SUM_PHDR = 0x2100 + 0x0000 + ... + 0x0011 + 0x000C
         = 0x1CB4C

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

代码语言:javascript
运行
复制
UDP Hdr  : 26 92 26 92 . 00 0C 00 00
UDP Body : 12 34 56 78

UDP部分的总和是:

代码语言:javascript
运行
复制
SUM_BODY = 0x2692 + 0x2692 + ... + 0x5678
         = B5DC

第3步)计算总计

代码语言:javascript
运行
复制
SUM_TOTAL = SUM_PHDR + SUM_BODY
          = 0x1CB4C + 0xB5DC
SUM_TOTAL = 0x28128  (or 0x00028128)

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

代码语言:javascript
运行
复制
SUM_16BIT = 0x0002 + 0x8218
          = 0x821A

第五步)计算16位和的恭维。

代码语言:javascript
运行
复制
CHECKSUM  = 0x821A Xor 0xFFFF
          = 0x7ED5

您的校验和是0x7ED5。

该过程与IPv4相同。区别仅仅是伪标头中源IP和目标IP的长度(步骤1)。

票数 13
EN

Stack Overflow用户

发布于 2017-04-26 06:35:46

使用udp协议计算理解60000000000C1120FD00C001C0DE0077007700FFFE000005FD00C001C0DE000100000000000000020FDB0328000CED1401020304 ipv6的明确示例假设您有ipv6数据包的数据作为IPV6 IPV6报头60000000 000C 11 20

IP报头部分伪报头( IT是将UDP或协议连接到IPVX报头的部分,因此将其命名为PSEDUO报头,它不是真正的报头,而是使链接BTWN 2) SRC和DSTN地址和协议以及我们必须从IP报头中提取的LENTGH是0X000C和协议OX11。

FD00C001C0DE0077007700FFFE000005 FD00C001C0DE00010000000000000002 UDP头启动0FDB 0328 000C ED14校验和

数据0102 0304

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

注意: ipv6报头没有校验和字段,因此必须在其中选择IPv6伪Header.= (源IP、目标IP、协议、UDP/TCP长度(header+body)),选择src地址并使其在16位FD00:C0DE:0077:0077:00FF:FE00:FE00:C001:C0DE:C0DE:77:77:FF:FE00:5与目标地址FD00:C001:C0DE:1:2相同。

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

udp报头有源端口(16位)= 0x0fdb dstn端口0x0328长度= 0x000c校验和(待计算),因此考虑= 0x0000

数据组为(16位)0x0102,0x0304。注:如果奇数假设05,则取0x0500。

这里的校验和为:伪header+udp头的16位和+伪header= header=的数据和。

伪header= 5fbd0和(16位和可以在这里或在每个步骤之后完成,或者在最后结果是相同的)和udp头= 0x0fdb+0x0328+0x000c+0x0000+0x000 = 0x130f

数据和= 0x0102+0x0304 = 0x0406

所有5fbd0+0x130f+0x0406 = 0x612e5的总和为16位和,方法是将5位数字相加到它= 0X12E5+6 = 0X12EB。

发送器校验和将是来自IP报头、UDP报头和数据的信息的伪报头的补和的16位校验,如果有必要的话,在末尾(如果需要的话)填充零个八位数,以使两个八进制数的倍数。

所以这里1,S补码是0X12EB XOR 0XFFFF =0XED 14 (CHEKSUM)

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30858973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档