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);
}
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);
}
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|...........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..........................................|
覆盖I P数据报中的任何数据。
U D P和T C P在首部中都有覆盖它们首部和数据的检验和。U D P的检验和是可选的,而T C P
的检验和是必需的。