IPV6上的TCP校验和

时间:2017-02-06 15:29:58

标签: c tcp drivers

我试图找出TCP over IPV6的校验和。请参阅以下代码。考虑的领域是:

  1. 源地址128位
  2. 目标地址128位
  3. TCP段长度
  4. 协议类型(TCP为6)
  5. 代码:

    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的校验和。不知道这里缺少什么。 你能帮忙吗?

0 个答案:

没有答案