【问题标题】:UDP checksum calculation for IPv6 packetIPv6数据包的UDP校验和计算
【发布时间】:2015-08-31 18:19:30
【问题描述】:

我正在尝试了解 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 01 60
UDP 头是 -- 26 92 26 92 00 0c 7e d5
数据是 -- 12 34 56 78

根据校验和计算,校验和为 7ed5。谁能解释校验和如何以该值结束?我想手动计算以了解方法。

【问题讨论】:

    标签: udp ipv6 checksum


    【解决方案1】:

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

    您的 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) 计算伪头的 16 位和。伪头包含Source IP、Destination IP、Protocol、UDP/TCP Length(header+body)

    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
    

    步骤 2) 计算 UDP Header + Data 的 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 位 Sum 的补码

    CHECKSUM  = 0x821A Xor 0xFFFF
              = 0x7ED5
    

    你的校验和是 0x7ED5

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

    【讨论】:

    • 对于第 4 步,0x28128 不应导致 0x0002 + 0x8128 的 16 位总和
    【解决方案2】:

    用udp协议计算理解ipv6的清晰例子 假设您有 ipv6 数据包的数据为 60000000000C1120FD00C001C0DE0077007700FFFE000005FD00C001C0DE000100000000000000020FDB0328000CED1401020304 IPV6 标头 60000000 000C 11 20

    IP 报头部分伪报头(它是将 UDP 或协议链接到 IPVX 报头的部分,因此将其命名为伪报头,但它不是真正的报头,但要在 BTWN 2 处建立链接)SRC 和 DSTN 地址和协议以及我们要添加的长度必须从 IP 报头 LENTFTH 以上是 0X000C 和协议 OX11 中提取

    FD00C001C0DE0077007700FFFE000005

    FD00C001C0DE000100000000000000002 UDP 报头开始 0FDB

    0328

    000C

    ED14 校验和

    数据 0102 0304

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

    注意:ipv6 标头没有校验和字段,因此必须在其中包含 udp 或其他协议校验和才能正确数据包 IPv6 伪报头。=(源 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

    Protocol = 0x0011(udp) // 必须包含 长度 = 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)

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2014-08-16
      • 2010-12-18
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多