我试图找出TCP over IPV6的校验和。请参阅以下代码。考虑的领域是:
代码:
char src_addr[] = {
0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xa1, 0xe4, 0x22, 0x2c, 0x0c, 0x9b, 0x57, 0x22
};
char dest_addr[] = {
0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0xd7, 0xc9, 0x57, 0x52, 0xd7, 0x0f, 0xcd
};
_inline unsigned short TOWORD(unsigned int a)
{
return (unsigned short)( ((a>>8)&0x00FFL) + ((a<<8)&0xFF00L) );
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int sum=0;
for(int i = 0; i < 16; i += 2)
{
sum += src_addr[i] + (src_addr[i+1] << 8U);
}
for(int i = 0; i < 16; i += 2)
{
sum += dest_addr[i] + (dest_addr[i+1] << 8U);
}
unsigned short type = 0x06; // TCP protocol
sum += TOWORD(type);
unsigned int tcplen = 0x1c; // 28 bytes length
sum += ((tcplen <<8) & 0xFFFF) + (tcplen >> 8);
sum = (sum>>16)+(sum&0xffff);
sum += (sum>>16);
sum = (~sum & 0xFFFF);
unsigned short sum1 = sum;
printf("Checksum = %x\n", sum1);
return 0;
}
结果为3e9c的校验和。
然而,WireShark显示0x3c3b的校验和。不知道这里缺少什么。 你能帮忙吗?