网站大量收购独家精品文档,联系QQ:2885784924

IPV6与IPV4报文比较.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IPV6与IPV4报文比较

解析IPV4报文 和IPV6 报文的 checksum 的算法: 校验和(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] 8 0xff00) | (UINT16)p[num + 1] 0x00FF; 2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上 网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加, ??????? size? -= 2; ??????? num?? += 2; ??? } ??? if (size 0) 如果长度为奇数 ??? { ??????? cksum += ((UINT16)p[num] 8) 0xFFFF; 如果总的字节数为奇数,则最后一个字节单独相加 ??????? 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) 2; 在ipv4 头中,版本类型和头长度加在一起是1 个字节(8位),各占4位,版本类型在前,长度在后,所以要取长度只能取低4 位, ??????? pIpHeader-chksum = 0; 因为不包括原来的checksum值,所以在每次计算前先把checksum的值置0,然后计算 ??????? sum = Checksum(0, (VOID *)pIpHeader, ipHeadLen); 对整个ip包头的累加 ?????? ?pIpHeader-chksum = HTONS((UINT16)(~sum)); 结果为计算值的反码,(别忘转化为网络字节序) ? 2、ipv6包头 在ipv6中已经省略了checksum 部分,但在后面的部分要有的,比如TCP/UDP包,别高兴的太早 ? 二、 TCP/UDP 报文的计算(举例UDP): 这里的checksum包含两部分,一部分是伪头的累加,还有一部分是UDP 包的累加(不包括原来的checksum值) 伪头有分ipv4和ipv6两种,分别包含如下几部分,这里做下比较 ? ? ? IPV4 IPV6 目的地址 4字节(32位) 16字节(128位) 源地址 4字节(32位) 16字节(128位) 协议类型 1字节(8位)(Protocol) 1字节(8位)(next header) (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); 主机字节序转化为网络字节序,存入数据包中,一定要注意,我们做的所有累加也是网络字节序,这里一定要搞清楚,以防混淆搞错了 ??????? sum += (pUdpHeader-len 8 0x00FF)

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档