无法获得正确的icmpv6校验和

问题描述 投票:0回答:2

需要编写一个工具来构造整个 ICMPv6 数据包。我似乎无法获取生成正确 ICMPv6 校验和的代码。我已经尝试过以下

checksum(void * buffer, int bytes)
功能

在C中计算ICMPv6数据包的校验和

我有一个wireshark捕获,用于验证校验和。原来的数据包内容是这样的

0000   33 33 00 00 00 01 38 ea a7 89 be 59 86 dd 60 00
0010   00 00 00 20 3a ff fe 80 00 00 00 00 00 00 88 c5
0020   75 41 aa 0c 58 ee ff 02 00 00 00 00 00 00 00 00
0030   00 00 00 00 00 01 88 00 b8 cc 20 00 00 00 fe 80
0040   00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee 02 01
0050   38 ea a7 89 be 59

数据包中的正确校验和当然是

0xb8cc
。上面的数据包是整个 IPv6 数据包,但数据包的相关内容是从源地址开始的,即
fe 80 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee
。 ICMPv6 标头从
88 00
开始。

我认为上面链接中的校验和函数可能是正确的,但我正在构建的用于计算校验和的缓冲区可能不正确。按照 RFC,我通过连接源地址、目标地址、数据包长度 (32 = 00 20)、下一个标头 (58 = 3a)、ICMPv6 数据包的其余部分构建了缓冲区,这给了我最终的缓冲区

uint8_t packet[] = {
                0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,
                0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee,
                0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00,
                0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01,
                0x00 , 0x20 ,0x3a , 0x88 ,0x00 , 0x00 ,0x00 ,
                0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 ,
                0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 ,
                0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea ,
                0xa7 , 0x89 ,0xbe , 0x59
                };
我将校验和函数称为

fprintf(标准输出,“%x ", ~checksum(packet, sizeof(packet)));

但我得到的校验和值是

ffffd174
。忽略前 2 个字节,我得到 7510。

你知道我做错了什么吗?我认为校验和函数中可能存在字节序问题,但我也可能错误地构造了伪标头。

ipv6 checksum
2个回答
0
投票

解决了问题,因此发布更正以防其他人正在寻找它。

问题在于我如何将 nextheader 添加到校验和函数的输入数据中。我需要在 Nextheader 前添加一个 0x00 字节作为前缀。伪标头部分的最后 32 位应该为零,后跟下一个标头。由于前 16 位仅添加到 0,因此在下一个标头之前仅添加一个零字节就足够了。所以校验和函数的输入数据最终是

    uint8_t packet[] = {
            0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, // src
            0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee,
            0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, // dst
            0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01,
            0x00 , 0x20 , // length 32
            0x00 , 0x3a , // next header 58
            0x88 , // type
            0x00 , // code
            0x00 , 0x00 , // checksum
            0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 , // body
            0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 ,
            0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea ,
            0xa7 , 0x89 ,0xbe , 0x59
    };

0
投票

当 IPv6 标头中存在扩展时,这对您有用吗?这对我不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.