- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 ;\nsubl $4, %2 ;\njbe 2f ;\naddl 4(%1), %0 ;\nadcl 8(%1), %0 ;\nadcl 12(%1), %0 ;\n1: adcl 16(%1), %0 ;\nlea 4(%1), %1 ;\ndecl %2 ;\njne 1b ;\nadcl $0, %0 ;\nmovl %0, %2 ;\nshrl $16, %0 ;\naddw %w2, %w0 ;\nadcl $0, %0 ;\nnotl %0 ;\n2: ;\n/* Since the input registers which are loaded with iph and ihlare modified, we must also specify them as outputs, or gccwill assume they contain their original values. */: =r (sum), =r (iph), =r (ihl): 1 (iph), 2 (ihl): memory);return(sum);} 在这个函数中,第一个参数显然就是IP数据报
文档评论(0)