现在的位置: 首页 > 综合 > 正文

网络数据的校验

2013年04月17日 ⁄ 综合 ⁄ 共 528字 ⁄ 字号 评论关闭

这里一个简单的网络校验,让我感到很迷惑:

USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{

cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);//这两行是否可以不要呢?不行是long
cksum += (cksum >>16);                            //
return (USHORT)(~cksum);
}

 

 

 

校验的原理是:把各个字段的值相加,然后对他的和进行取反!假设和为SUM,则结果为 ~SUN

一般书上说:如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该全是1.

其实就是在收到数据后对各个字段进行相加,然后和校验值相加,这里假设为SUM_RECV。如果没有错误,应该和前面的~SUM相等。他们相加的话各字段自然为1

 

UDP中,参与计算CHEKCSUM的数据包括三部分: UDP头部+数据部分+(4byte源IP地址 + 4byte目的IP地址 + 0x00 + 1byte协议 + UDP长度(2byte))

抱歉!评论已关闭.