IP数据包的校验和算法(载)).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IP数据包的校验和算法(载) 2007-11-02 10:52 IP数据包的头信息格式: +-------------------------------------------------+ | 版本 (4位) | +-------------------------------------------------+ | 首部长度(4位) | +-------------------------------------------------+ | 服务类型(TOS)8位 | +-------------------------------------------------+ | 数据包总长度(16位) | +-------------------------------------------------+ | 标识ID号(16位) | +-------------------------------------------------+ | 标志位(3位) | +-------------------------------------------------+ | 片偏移(13位) | +-------------------------------------------------+ | 生存时间(TTL)(8位) | +-------------------------------------------------+ | 协议类型 (8位) | +-------------------------------------------------+ | 首部校验和(16位) | +-------------------------------------------------+ | 源IP地址(32位) | +-------------------------------------------------+ | 目的IP地址 (32位) | +-------------------------------------------------+ * IP选项(若有) (32位) * +-------------------------------------------------+ * 数据 * +-------------------------------------------------+ 这里要说的是首部校验和字段。 在发送数据时,为了计算数IP据报的校验和。应该按如下步骤: (1)把IP数据报的校验和字段置为0。 (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。 (3)把得到的结果存入校验和字段中。 在接收数据时,计算数据报的校验和相对简单,按如下步骤: (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。 (2)检查计算出的校验和的结果是否等于零。 (3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。 首先,查看了Linux 2.6内核中的校验算法,使用汇编语言编写的,显然效率要高些。代码如下: unsigned short ip_fast_csum(unsigned char * iph, unsigned int ihl) { unsigned int sum; __asm__ __volatile__( movl (%1), %0 ;\n subl $4, %2 ;\n jbe 2f ;\n addl 4(%1), %0 ;\n adcl 8(%1), %0 ;\n adcl 12(%1), %0 ;\n 1: adcl 16(%1), %0 ;\n lea 4(%1), %1 ;\n decl %2 ;\n jne 1b ;\n adcl $0, %0 ;\n movl %0, %2 ;\n shrl $16, %0 ;\n addw %w2, %w0 ;\n adcl $0, %0 ;\n notl %0 ;\n 2: ;\n /* Since the input registers which are loaded with iph and ihl are modified, we must also specify them as outputs, or gcc will assume they contain their original values. */ : =r (sum), =r (iph), =r (ihl) : 1 (iph), 2 (ihl) : memory); return(sum); } 在这个函数中,第一个参数显然就是IP数据报

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档