我需要写一个工具,在那里我需要构造整个ICMPv6数据包。我似乎无法获得生成正确的ICMPv6校验和的代码。我尝试过下面的checksum(void * buffer, int bytes)函数
Calculating checksum of ICMPv6 Packet in C
我有一个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 =0020)、下一个报头(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(stdout,"%x\n",~checksum(数据包,sizeof(数据包);
但是我得到的校验和值是ffffd174。忽略前两个字节,我得到7510。
你知道我做错了什么吗?我认为在校验和函数中可能存在端序问题,但我也可能不正确地构造了psuedo-header。
发布于 2017-04-03 17:16:17
找出了问题,所以发布更正,以防其他人正在寻找它。
问题出在我如何将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
};https://stackoverflow.com/questions/43147497
复制相似问题