ipv6与ipv4报文比较

ipv6与ipv4报文比较

ID:14802604

大小:48.50 KB

页数:4页

时间:2018-07-30

ipv6与ipv4报文比较_第1页
ipv6与ipv4报文比较_第2页
ipv6与ipv4报文比较_第3页
ipv6与ipv4报文比较_第4页
资源描述:

《ipv6与ipv4报文比较》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、解析IPV4报文和IPV6报文的checksum的算法:校验和(checksum)算法,简单的说就是16位累加的反码运算:计算函数如下:我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。UINT32Checksum(UINT32cksum,VOID*pBuffer,UINT32size){   INT8num=0;   UINT8*p=(UINT8*)pBuffer;    if((NULL==pBuffer)

2、

3、(0==size))   {   

4、    returncksum;   }      while(size>1)   {       cksum+=((UINT16)p[num]<<8&0xff00)

5、(UINT16)p[num+1]&0x00FF;2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上 网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加,       size -=2;       num  +=2;   }   if(size>0)如果长度为奇数   {       cksum+=((UINT16)p[num]<<8)&0xFFF

6、F;如果总的字节数为奇数,则最后一个字节单独相加       num+=1;   }    while(cksum>>16)   {       cksum=(cksum&0xFFFF)+(cksum>>16);累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0   }      returncksum;} 注意:UINT32cksum的类型,这里是4个字节的,防止在累加的过程中,数据溢出,(例如0xFF累加时就会内存溢出) 详细的计算过程和原理如下一:ip头的计算:直接对头部数据进行累加(不包括原来的checksum值):1、ipv4包头 

7、       ipHeadLen =(pIpHeader->ver_ihl&0x0F)<<2;在ipv4头中,版本类型和头长度加在一起是1个字节(8位),各占4位,版本类型在前,长度在后,所以要取长度只能取低4位,       pIpHeader->chksum=0;因为不包括原来的checksum值,所以在每次计算前先把checksum的值置0,然后计算       sum=Checksum(0,(VOID*)pIpHeader,ipHeadLen);对整个ip包头的累加       pIpHeader->chksum=HTONS((UINT16)(~sum))

8、;结果为计算值的反码,(别忘转化为网络字节序) 2、ipv6包头在ipv6中已经省略了checksum部分,但在后面的部分要有的,比如TCP/UDP包,别高兴的太早 二、TCP/UDP报文的计算(举例UDP):这里的checksum包含两部分,一部分是伪头的累加,还有一部分是UDP包的累加(不包括原来的checksum值)伪头有分ipv4和ipv6两种,分别包含如下几部分,这里做下比较   IPV4IPV6目的地址4字节(32位)16字节(128位)源地址4字节(32位)16字节(128位)协议类型1字节(8位)(Protocol)1字节(8位)(nexthead

9、er)(TCP/UDP)长度2字节(16位)2字节(16位)    1、            ipv4类型的:第一部分,伪头部分的计算:sum =0;       udpLen =sizeof(UDP_HEADER_T)+dhcpLen;UDP的长度=UDP的包头长度+UDP的数据长度sum+= udpLen;或者,下面也是一样的,这里就是网络字节序和主机字节序的区别了,上面的是(主机字节序)直接累加,下面的是网络字节序,一定要变成主机字节序后累加       pUdpHeader->len=HTONS(udpLen);主机字节序转化为网络字节序,存入数据包中,

10、一定要注意,我们做的所有累加也是网络字节序,这里一定要搞清楚,以防混淆搞错了       sum+=(pUdpHeader->len>>8&0x00FF);2个字节的累加,先取网络字节序的高位,右移8位,变成主机字节序的低位,累加       sum+=(pUdpHeader->len<<8&0xFF00);在取网络字节序的低位,左移8位,变成主机字节序的高位,累加              sum =Checksum(sum,(VOID*)&pIpHeader->saddr,4);       sum =Checksum(sum,(VOID*)&pIpHeade

11、r->da

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。