【发布时间】:2014-11-28 05:10:22
【问题描述】:
我无法计算出准确的校验和。我的路由器因此拒绝了我的 Hello 消息。这是十六进制的包(从 ospf 标头开始)
vv vv <-- my program's checksum
0000 02 01 00 30 c0 a8 03 0a 00 00 00 00 f3 84 00 00 ...0............
0010 00 00 00 00 00 00 00 00 ff ff ff 00 00 0a 00 01 ................
0020 00 00 00 28 c0 a8 03 0a c0 a8 03 0a ...(........
Wireshark 调用 0xf384 bogus 并说预期值为 0xb382。我已经确认我的算法会以正确的顺序成对选择字节,然后将它们加在一起:
0201 + 0030 + c0a8 + ... + 030a
无需担心身份验证。我们甚至没有被教导如何设置它。最后,这是我计算校验和的方法:
OspfHeader result;
result.Type = type;
result.VersionNumber = 0x02;
result.PacketLength = htons(24 + content_len);
result.AuthType = htons(auth_type);
result.AuthValue = auth_val;
result.AreaId = area_id;
result.RouterId = router_id;
uint16_t header_buffer[12];
memcpy(header_buffer, &result, 24);
uint32_t checksum;
for(int i = 0; i < 8; i++)
{
checksum += ntohs(header_buffer[i]);
checksum = (checksum & 0xFFFF) + (checksum >> 16);
}
for(int i = 0; i + 1 < content_len; i += 2)
{
checksum += (content_buffer[i] << 8) + content_buffer[i+1];
checksum = (checksum & 0xFFF) + (checksum >> 16);
}
result.Checksum = htons(checksum xor 0xFFFF);
return result;
我不确定我到底在哪里搞砸了。有什么线索吗?
【问题讨论】:
-
checksum未初始化。另外,这里有一个sample code 来了解如何对 OSPF 数据包进行校验和 -
我已经尝试了这两种方法,但都没有成功。我使用了来自维基百科的 Fletcher 的 16 位算法,最终结果不同:c