Internet Protocol层的checksum在Source:和Destination:之前出现,wireshark标记为Header checksum: 
User Datagram Protocol层的checksum在这一层的末尾出现。wireshark标记为checksum:当我计算校验和时,把Internet Protocol层的checksum值置为0,则结果正确,
可当计算User Datagram Protocol层校验和时,把末尾置0却得不到正确的结果,郁闷啊,什么原因哦?~
我用的是下面这个函数计算的校验和:
u_short checksum(u_short *buffer,int   size)
{
        unsigned   long   cksum=0;        while(size   >1)
        {
                cksum   +=   *buffer++;
                size   -=   sizeof(u_short);
        }
        if(size)
        {
                cksum   +=   *(u_char*)buffer;
        }
        cksum   =   (cksum   >>   16)   +   (cksum   &   0xffff);
        cksum   +=   (cksum   >>   16);
        return   (u_short)(~cksum);
}

解决方案 »

  1.   

    ip层的checksum只计算IP首部,UDP的checksum计算了UDP的首部和数据,另外计算udp的checksum时要注意伪首部,具体的可参考《tcpip详解》卷一。
      

  2.   

    伪首部,如图
    |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
    |...........32-bit source IP address..........................| 
    |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|  UDP
    |...........32-bit destination IP address.....................|  pseudo
    |~~~~~~~~~~~|~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| header
    |...zero..|.8-bit protocol(17).|.16-bit UDP length............|   
    |~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
    |.16-bit source port number.|..16-bit destination port number.|   
    |~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| udp header
    |.....16-bit UDP length.....|...16-bit UDP checksum...........|   
    |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
    |...............data..........................................|
      

  3.   

    U D P检验和覆盖U D P首部和U D P数据。回想I P首部的检验和,它只覆盖I P的首部—并不
    覆盖I P数据报中的任何数据。
    U D P和T C P在首部中都有覆盖它们首部和数据的检验和。U D P的检验和是可选的,而T C P
    的检验和是必需的。