计算机网络+课程设计+计算校验和_第1页
计算机网络+课程设计+计算校验和_第2页
计算机网络+课程设计+计算校验和_第3页
计算机网络+课程设计+计算校验和_第4页
计算机网络+课程设计+计算校验和_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 四 川 理 工 学 院课 程 设 计 书学院 计 算 机 学 院 专业 计 算 机 科 学 与 技 术 班级 零 八 级 六 班 题目 SNMP 的 简 单 实 现 教师 鲜乾坤 陈 超 学生 杨忠书 王琼伍 鲁阳琼 摘要IP协议为提高数据传输效率,简化了协议,舍弃了许多为提供可靠性所需要的工作(如建立连接、维护连接、拆除连接、确认应答、时间片处理等)。其唯一的正确性检验即依靠头部校验和,以保证头部数据的完整性。为了研究IP 首部校验算法,查看了相关的RFC文档并利用wireshark工具进行了抓包,并对抓包取得的数据进行了计算验证。研究发现了一些算法存在一定的问题并对它的改进算法进行了研究

2、。关键字: 计算校验和 并行计算 字节顺序 延迟 进位前言 本课程设计的主要意图是,通过计算机网络中的计算校验和来了解计算机是怎么样判断接收数据的正确与错误。同时也让我们更进一步的了解计算机的一般思想,从而了解计算校验和的目的与作用。最后我们要学会计算校验和,了解和扩展计算机网络的知识面。校验和的作用就是保证数据传送的正确性。本次课程设计的主要内容包括以下几个方面:课程设计目的,通过这一点我们可以了解我们为什么要计算校验和,它的作用和目的是什么,从而学会计算校验和。课程设计的要求,根据下面课程设计中的计算方法编制程序为给定数据计算检验和。计算校验和的相关知识,如交换性与结合性,字节顺序的自主性

3、,并行计算以及实例,以及给出一些编码技术可以提高校验和的速度。课程设计分析,主要是从数据的输入方式,校验和的计算流程图。对知识进行了一些扩展。给出了自己做课程设计的心得体会,和一些参考资料。本次课程设计的适用范围是,所有在校大学生和一些对计算机网络感兴趣的人都可以指导和参观。课程设计分工:杨忠书负责设计设计目的、设计要求、以及相关知识的收索。王琼伍主要负责本课程设计的课程设计的分析、程序流程图设计、和一些相关知识的扩展。鲁阳主要负责本课程设计的相关文献的查找、序言和目录的设定、文档排版及整个课程设计报告的整理。审校人:鲜乾坤、陈超相关的说明:本课程设计由于设计人的经验不足其中的一些内容可能有许

4、多不完整的地方。希望读者在阅读的时候能结合我们提供的文献一起参考。目 录第1章 概述.1 1.1设计综述.1 1.1.1设计目的.1 1.1.2设计要求.1 1.1.3设计原理.2 1.2计算校验和.3 1.2.1交换性和结合性.3 1.2.2字节顺序的自主性.4 1.2.3并进行计算.4 1.3示例.5 1.4一些编码技术可以提高校验和的计算速度.7 1.4.1延迟进位法.7 1.4.2反向循环法.7 1.4.3合并数据拷贝法.7第2章 设计分析.9 2.1数据的输入方式.9 2.2校验和的计算.10 2.3程序流程图.11第3章 相关扩展.12 3.1主要实现过程.12 3.2程序流程图.

5、13第4章 编程实现.14 4.1 程序源代码.14 4.2程序运行截图.17设计总结.18参考文献.20 第一章 概述1.1设计综述1.1.1设计目的网络上的信号最终,都是通过物理传输进行传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。为了保证数据的正确性,在物理层的基础,计了数据层。设计数据链路层的主要作用就是在原始的、有差错的线路改进成逻辑上无差错的数据链路,以向网络层提供高质量的服务。本课程设计主要通过一个简单例子使学生了解网络协议中校驵和的计算过程,以及设置校验和的作用。 目前,进行了差错检测和差错控制的主要方法是:在需要传输的数据分组后面加上一

6、定的冗余信息通常都是通过对所发送的数据应用某种算法进行计算而得到的。数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较不,如果结果不同说明出现了差错,此时可以要求发送方重传该组数据,以此达到保证数据准确性的目的。 在普通使用的网络协议中都设置了校验和项以保存冗余信息,例如IPV4、ICMPV4、IGMPV4、ICMPV6、UDP 和TCP等等。计算校验和算法称为网际协议和算法,简单来说,就是把被校验的数据按16位进行累加,然后取反码。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。关于计算更详细的信息请参考RFC1071。1.1.2设计要求根据前面介绍的算法,编制程

7、序为给定数据计算校验和。(1)、以命令行形式运行:check_sum infile其中check_sum为程序名,infile为输入数据文件名。 (2)、输出:数据文件的校验和。1.1.3设计原理采用的都是将数据流视为16位整数流进行重复叠加计算。为了计算检验和,首先把检验和字段置为0。然后,对有效数据范围内中每个16位进行二进制反码求和,结果存在检验和字段中,如果数据长度为奇数则补一字节0。当收到数据后,同样对有效数据范围中每个16位数进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全0或全1(

8、具体看实现了,本质一样) 。如果结果不是全0或全1,那么表示数据错误。IPv4IPv4层中的校验和只包括IPv4头部分,不包括上层协议头和应用层数据,校验和是必须计算的。 IPv6IPv6头本身已经不包括校验和字段,只靠上层协议的校验和。 ICMP/IGMPICMP/IGMP校验和计算范围为从ICMP/IGMP开始到数据结束,不包括IP头部分,校验和是必须计算的。 TCP/UDPTCP/UDP的校验和计算有点特殊,所计算的数据范围除了包括TCP/UDP头开始到数据结束外,还要包括一个IP伪头部分,所谓伪头,只有12字节数据,包括源地址(4字节)、目的地址(4字节)、协议(2字节,第一字节补0)

9、和TCP/UDP包长(2字节)。TCP的校验和是必须的,而UDP的校验和是可选的,如果UDP中校验和字段为0,表示不进行校验和计算,因此对于UDP协议数据的修改后想偷懒的话直接将校验和设为0 就可以了。1.2计算校验和 有很多数学方法可以用来提高校验和的计算速度,下面我们将就此展开讨论。1.2.1 交换性与结合性因为校验和主要考虑被校验数据中所包含字节数量的是奇数还是偶数,所以校验和的计算可以以任意顺序进行,甚至可以把数据进行分组后再计算。例如,用A、B、C、D,Y,Z分别表示一系列八位组,用a,b这样形式的字节来表示a*256+b的整数,那么16位校验和就可以通过以下形式给出:A,B+C,D

10、+Y,Z 1A,B+C,D+Z,0 2在这里,+代表1补数加法,即将前面的16位校验和按位取反。1可以以(A,B+C,D+J,0+(0,K+Y,Z) 3的形式进行计算。1.2.2 字节顺序的自主性打破被校验数据中的字节顺序仍可以计算出正确的16位校验和。例如,我们交换字节组中两字节的顺序,得到B,A+D,C+Z,Y 4所得到的得结构与1式是相同的(当然结果也是要进行一次反转的)。为什么会是这样呢?我们发现两种顺序获得的进位是相同的,都是从第15位到第0位进位以及从第7位到第8位进位。这也就是说,交换字节位置只是改变高低位字节的排列顺序,但并没有改变它们的内在联系。因此,无论底层的硬件设置中对字

11、节的接收顺序如何,校验和都可以被准确地校验出来。例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网络序(低位字节在前高位字节在后)存放在内存中。每一个16位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原本以网络序存储的数据帧中的校验和项保持一致了。1.2.3 并进行计算某些机器的字处理长度是16位的倍数,这样可以提高它的计算速度。由于加法所具有的结合性,我们没有必要按照顺序对每个字节进行累加。相反,我们可以利用这一特点对它们进行并行累加。并行地计算校验和只是增加了每次累加的信息长度。例如,在一个323位的机器上,我们可

12、以一次增加4个字节,即A,B,C,D+。计算结束后再把累加和“折叠”起来,把一个32位的数值变为16位,这样产生的新的进位也要循环累积起来。此外,在此仍不考虑字节顺序的问题,我们可以用D,C,B,A+或B,A,D,C+;这样的顺序来计算校验和,最终再通过交换16位校验和中的字节序来得到正确的值。这些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。1.3 示例下面将通过一个简单的例子来演示通过上述的几种方法所得到的校验和的情况16位按字节累加“正常”顺序交换顺序字节0/1:00 0100010100字节2/3:f2 03F20303f2字节4/5:f4

13、 f5f4f5f5f4字节6/7:f6 f7f6f7f7f6- -合计1:2dc 1f02ddf01f2dcdc f0ddf0f2dc进位:1 221- -合计2:dd f2ddf2f2dd最终结果:dd f2ddf2dd f232位按字节累加“正常”顺序交换顺序字节0/1/2/3:0001f203010003f203f20100字节4/5/6/7:f4f5f6f7f5f4f7f6f7 f6 f5f4-合计1:0f4f7e8fa0f6f4fbe80fbe8f6f4进位:000前半段:f4f7f6f4fbe8后半段:e8fafbe8f6f4-合计2:1ddf11f2dc1f2dcddf1f2dc

14、f2dc进位:111-合计3:ddf2f2ddf2dd最终结果:ddf2ddf2ddf2还有一个例子是把计算工作分为两组,第二组是以奇数边界起始的。按字节累加“正常”顺序字节0/1:00 010001字节2/:f2 (00)f200- -合计:f2 01f201字节4/5:03 f403f4字节6/7:f5 f6f5f6字节8/:f7 (00)f700- -合计2:1f0ea合计2:f0ea进位:1-合计3:f0eb合计1:f201合计3(交换字节序):ebf0-合计41ddf1合计4ddf1进位:1-合计5:ddf21.4一些编码技术可以提高校验和的计算速度1.4.1延迟进位法这种方法在主要

15、的累加循环结束之后再把进位累加进和值。其实现方式就是用32位的累加器获得16位校验和,这样溢出就产生在高16位上。这种方法避免了累加器中进位传感器机构的设置,但是它要求的容量是原来的累加器容量的两倍,因此它更多地依赖于硬件条件。1.4.2反向循环法这种方法可以减少由循环而产生的负荷,有效地展开内部的累加循环,把循环过程中的一系列加法命令复制下来。这种技术通常可以节省大量的时间,但是程序的逻辑设计会比较复杂。1.4.3合并数据拷贝法计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这样会占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶颈,尤其是对于某些机器(如一

16、些简单的慢速的微型机)来说,这一问题尤为严重。为了解决这个问题,可以把数据读入的过程与校验的过程合二为一,也就是在读入数据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。第二章 设计分析校验和的计算过程主要分为三个步骤:数据文件的输入,校验和的计算和校验结果的输出。其中,主要的是数据的输入和校验和的计算过程。2.1 数据的输入方式输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换。1)将读入的ASCII码转化为相应的整型变量。if(ch>=0&&<=9)ch-=0;els

17、eif(ch>=a&&ch<=f)ch=ch-a+10;elseif(ch>=A&&ch<=F)ch=ch-A+10;2)在使用C+编程时直接使用16进制的方式打开输入文件。Ifstream in(argv1,ios:nocreate);i.setf(ios:hex);2.2 校验和的计算校验和算法是本程序的核心部分,在2.5节中我们介绍了一些相关的算法,而应用最为普遍的是端循环进位法。端循环进位的算法如下:将数据按一定数位进行累加,最高位的进位则循环加入最低位。待校验的数据按16位为一个单位相加,采用端循环进位,最后对所得16位的数据取

18、反码。因为待校验的数据是以字节方式分隔的,所以为了方便,将16位的数据分成高8位和低8位分别处理。该算法的代码如下:endaroundcarry(int &highyte,int &lowbyte)while(highbyte>0xff|lowbyte>0xff)0 /高8位或低8位中的任何一方产生了溢出(进位)lowbyte+=(highbyte>>8); /低字节加上高字节超过8位的进位highbyte=highbutr&0xff; /清除高字节的进位highbyte+=(lowbyte>>8); /高字节加上来自低字节的进位lo

19、wbyte=lowbyte&0xff; /清除低字节的进位2.3 程序流程图程序开始,初始化 ch,count,sum,checksum 从文件读取一个字符 Ch=EOF? Ch= Ch转换为相应的8位数据,count+ Count偶数? Ch低4位送入chr低四位 Ch低4位送入chr高4位得到chr 值 将32位sum折叠到16位 求sum反码并输出 结束 (count/2)%2=1? 得到sum Chr和sum低8位相加 Chr和sum高8位相加 Y Y Y Y N N N N 图2-1给出了一个流程的参考方案。第三章 相关扩展前面我们提到,校验和还有其他一些计算方法,下面我们就

20、来简要介绍以下利用延迟进位法进行计算的方法。延迟进位法的算法描述:将进位累加的过程延迟到整个累加循环结束之后进行,这样可以提高计算速度。3.1 主要的实现过程while(!infile.eof()/判断文件是否结束,若否则对被校验的16位数据进行累加int h, 1;/分别表示16位数据的高8位和低8位infile>>hex>>h;/从文件中读入一个16进制表示的数据,作为高8位if(infile.eof() l=0;/若后面没有其他数据,将0作为低8位else infile>>hex>>1;/若后面还有数据,读入下一个作为低8位sum+=(h*

21、256+l);/将组合好的16位数据累加到sum中infile.close();/关闭文件check_sum=short(sum&0xffff)+(sum>>16);/将32位累加和转换为16位数据/若累加过程中有向高16位的进位,则要将进位部分加到低16位上check_sum=-check_sum;/对累加和取反码开始 命令行输入正确? 创建输入文件流,打开指定输入文件, 32位累加器sum置0 文件结束? 读入下一个字节数据作为高8位 后面还有数据? 读入下一个字节数据作为低8位 将组合好的16位数据加到sum中欧 输出格式提示 退出 关闭文件 取sum的低16位sum

22、&oxffff Sum高16位为0? 将sum高16位数据sum>>16加到低16位上 对所得数据取反,即为check_sum 输出check_sum 结束 Y 低8位置0N N N Y Y N 3.2 程序流程图第四章 编程实现4.1 程序源代码 #include<stdio.h>#include<stdlib.h>void main(int argc, char *argv)/指针数组作为主函数参数,用于函数带参数入/定义并初始化变量FILE *fp;char ch;unsigned char chrl,chrh;unsigned int cou

23、nt=0,checksum=0,chr=0;unsigned long int sum=0;/打开文件argv1if(fp=fopen("d:jiaoyan.txt","r")=NULL)printf("nn File can't be opened");exit(1);printf("nnthe type of output:data-sumnn");/从txt文件读取字符,并进行数据处理while(1)if(ch=fgetc(fp)!=EOF)count+;if(ch!=' ')if(c

24、ount%12=0)printf("n"); /将字符转换成相应的整形变量if(ch>='0'&&ch<='9')ch-='0'elseif(ch>='a'&&ch<='f')ch=ch-'a'+10;elseif(ch>='A'&&ch<='F')ch=ch-'A'+10; /计算8字节数的累加值,将奇数位累加到长整形sum的158位,偶数位累加到

25、低80位/这样就避免了数据个数为奇偶的处理操作if(count%2=1)chrh=ch<<4;elsechrl=ch&0x0f;chr=chrh|chrl;if(count%4=2)sum+=chr<<8;elseif(count%4=0)sum+=chr;printf("%x-%lx ",chr,sum);elsecount-;elsebreak;/将sum由32位折合成16位if(sum>>16)checksum=(long(sum>>16)+long(sum&0x0000ffff);checksum=ch

26、ecksum&0x0000ffff;/结果输出printf("nnsum:%lx-checksum:%x",sum,checksum);printf("nnsource:argc=%d,targv=%sn",argc,argv1); fclose(fp); 4.2 程序运行截图打开运行窗口,输入“cmd”命令,调用本程序并输入命令,可看到该程序能对指定文件进行校验和的计算设计总结这次课程设计主要是完成校验和的计算,由于之前对这方面的知识了解不是很多,所以在课设刚开始的几天我去图书馆查阅了大量的相关知识,随后我又结合老师发给我们的资料对校验和做了进一步的了解,才对校验和的知识有了一定的掌握,并且知道了设置校验和的作用。计算校验和的算法其实就是把被校验的数据按16位进行累加,然后取反码。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。有了思路,程序的设计就变得容易许多,加上一些关键代码的提示,很快我就把整个程序的基本代码都完成了。当然在调试的过程中还是出现了一点问题,不过在老师和同学的耐心帮助下最后我还是把程序给调试出来了。随着学期结束的来临,课程设计也接近了尾声。经过几周的奋战我的课程设计终于完成了。在没有做课程设计以前觉得课程设计只是对这一学期所学知识的单纯总结,但是通过这次做课程设计发现自己的看法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论