ipv4校验和计算


ipv4校验和的计算原理:计算方法一:除去校验和的两位,将其他的位相加:45+00+00+3c+55+81+00+00+40+01+ac+1c0f+0d+ac+1c+0f+0e=
计算方法二:

校验和(checksum)算法,简单的说就是16位累加的反码运算:计算函数如下:我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。UINT32 Checksum(UINT32 cksum, VOID*pBuffer, UINT32 size){INT8 num = 0;UINT8 *p = (UINT8 *)pBuffer;if ((NULL == pBuffer) || (0 == size)) {return cksum; }while (size > 1) {cksum += ((UINT16)p[num] /*2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上 网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加,*/size -= 2;num += 2; }if (size > 0)//如果长度为奇数 {cksum += ((UINT16)p[num] //如果总的字节数为奇数,则最后一个字节单独相加num += 1; }while (cksum >> 16) {cksum = (cksum & 0xFFFF) + (cksum >> 16);//累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0 }return cksum;}注意:UINT32 cksum的类型,这里是4个字节的,防止在累加的过程中,数据溢出,(例如0xFF累加时就会内存溢出)详细的计算过程和原理如下一:ip头的计算:直接对头部数据进行累加(不包括原来的checksum值):1、ipv4包头ipHeadLen =(pIpHeader->ver_ihl & 0x0F) 在ipv4头中,版本类型和头长度加在一起是1个字节(8位),各占4位,版本类型在前,长免费云主机域名度在后,所以要取长度只能取低4位,pIpHeader->chksum = 0;因为不包括原来的checksum值,所以在每次计算前先把checksum的值置0,然后计算sum = Checksum(0, (VOID *)pIpHeader, ipHeadLen);对整个ip包头的累加pIpHeader->chksum = HTONS((UINT16)(~sum));结果为计算值的反码,(别忘转化为网络字节序)

相关推荐: linux有哪些包管理

今天小编给大家分享一下linux有哪些包管理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 8种常用包管理有:1、DPKG,Debian系的包管…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/31 18:54
下一篇 01/31 18:54