ip数据报首部校验和的计算

网络层间的数据传送特点是:

  不可靠:    分组可能丢失,乱序等,不做确认;

  无连接:    每个分组都独立对待;

  尽力投递: 不随意放弃分组;

  点到点。

因为在传输过程中会受到很多的干扰,ip数据包会发生改变,这时接受着收到这个ip数据包毫无意义。在这种情况下应把这样的数据包丢掉。那么怎样确定数据包发生了变化,这就用到了首部校验和。就是发送者把Ip首部的校验和外的数据全部相加再取反再放到校验和位置(如果高位有溢出的就把溢出数据加到低位)。接收者只要把整个ip数据报首部数据相加,判断是否为0,如果是0就收下,如果不是的话就扔提。

   具体实现的代码是:

  1. /*求校验和函数*/  

  2. USHORT CheckSum(USHORT *buffer, int size)  

  3. {  

  4.     unsigned long cksum=0;  

  5.     while (size > 1)   

  6.     {  

  7.         cksum += *buffer++;  

  8.         size -= sizeof(USHORT);  

  9.     }  

  10.     if (size)   

  11.     {  

  12.         cksum += *(UCHAR*)buffer;  

  13.     }  

  14.     /*对每个16bit进行二进制反码求和*/  

  15.     cksum = (cksum >> 16) + (cksum & 0xffff);  

  16.     cksum += (cksum >>16);  

  17.     return (USHORT)(~cksum);  

  18. }  



不可靠:    分组可能丢失,乱序等,不做确认;

无连接:    每个分组都独立对待;

尽力投递: 不随意放弃分组;

点到点。