1、班级: 2009 级教育技术学一班作者: 郭建勋 200930680106林泽涛 200930680113张丽丽 200930680127指导老师: 完成时间:2011 年 12 月 16 日华南农业大学 信息学院计算机网络课程设计实验报告题目:计算校验和目录1、题目概述 .31.1 题目: 31.2 题目要求 32、开发的基础知识 .32.1 计算校验和 32.2 一些编码技术可以提高校验和的计算速度 43、设计思路 .53.1 数据的输入方式 .53.2 校验和的计算 .54、程序流程图 .75、程序源代码 .86、开发过程 .117、程序运行情况 .118、总结 128.1 林泽涛的心得
2、体会 128.2 郭建勋的心得体会 121、题目概述1.1 题目:校验和的计算过程分为三个步骤:数据文件的输入,校验和的计算以及效验结果的输出。计算校验和应用最为普遍的是端循环进位法:将数据按一定数位进行累加,最高位的进位则循环加入最低位。待教研的数据按 16 位为一个单位相加,采用端循环进位,最后对所得 16 位的数据取反码。因为待教研的数据是以字节方式分隔的,所以为了方便,将 16位的数据分成高 8 位和低 8 位分别处理。该算法的代码如下:endaroundcarry(int highbyte=highbytehighbyte+=(lowbyte8);lowbyte=lowbyte1.2
3、 题目要求课程设计要求:根据上面介绍的算法,编制程序为给定数据计算校验和。1)以命令行形式运行:check_sum infile其中 check_sum 为程序名, infile 为输入数据文件名。2)输出:数据文件的校验和。2、开发的基础知识2.1 计算校验和有很多数学方法可以用来提高校验和的计算速度,下面我们将就此展开讨论。2.1.1 交换性与结合性因为校验和主要考虑被校验数据中所包含字节数量的是奇数还是偶数,所以校验和的计算可以以任意顺序进行,甚至可以把数据进行分组后再计算。例如,用 A、B、C、D,Y,Z 分别表示一系列八位组,用a,b这样形式的字节来表示 a*256+b 的整数,那么
4、 16 位校验和就可以通过以下形式给出:A,B+C,D+Y,Z 1A,B+C,D+Z,0 2在这里,+代表 1 补数加法,即将前面的 16 位校验和按位取反。1可以以(A,B+ C,D+J,0+(0,K+Y,Z) 3的形式进行计算。2.1.2 字节顺序的自主性打破被校验数据中的字节顺序仍可以计算出正确的 16 位校验和。例如,我们交换字节组中两字节的顺序,得到B,A+D,C+Z,Y 4所得到的得结构与1式是相同的(当然结果也是要进行一次反转的) 。为什么会是这样呢?我们发现两种顺序获得的进位是相同的,都是从第 15 位到第 0 位进位以及从第 7 位到第 8 位进位。这也就是说,交换字节位置只
5、是改变高低位字节的排列顺序,但并没有改变它们的内在联系。因此,无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出来。例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网络序(低位字节在前高位字节在后)存放在内存中。每一个 16 位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原本以网络序存储的数据帧中的校验和项保持一致了。2.1.3 并进行计算某些机器的字处理长度是 16 位的倍数,这样可以提高它的计算速度。由于加法所具有的结合性,我们没有必要按照顺序对每个字节进行累加。相反,我们可以利用这一特点对它们进
6、行并行累加。并行地计算校验和只是增加了每次累加的信息长度。例如,在一个 323 位的机器上,我们可以一次增加 4 个字节,即 A,B,C,D+。计算结束后再把累加和 “折叠”起来,把一个 32 位的数值变为 16 位,这样产生的新的进位也要循环累积起来。此外,在此仍不考虑字节顺序的问题,我们可以用D,C,B,A+或B,A,D,C+; 这样的顺序来计算校验和,最终再通过交换 16 位校验和中的字节序来得到正确的值。这些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。2.2 一些编码技术可以提高校验和的计算速度2.2.1 延迟进位法这种方法在主要的累加循
7、环结束之后再把进位累加进和值。其实现方式就是用 32 位的累加器获得 16 位校验和,这样溢出就产生在高 16 位上。这种方法避免了累加器中进位传感器机构的设置,但是它要求的容量是原来的累加器容量的两倍,因此它更多地依赖于硬件条件。2.2.2 反向循环法这种方法可以减少由循环而产生的负荷,有效地展开内部的累加循环,把循环过程中的一系列加法命令复制下来。这种技术通常可以节省大量的时间,但是程序的逻辑设计会比较复杂。2.2.3 合并数据拷贝法计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这样会占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶颈,尤其是对于某些机
8、器(如一些简单的慢速的微型机)来说,这一问题尤为严重。为了解决这个问题,可以把数据读入的过程与校验的过程合二为一,也就是在读入数据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。3、设计思路3.1 数据的输入方式输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换。1) 将读入的 ASCII 码转化为相应的整型变量。if(ch=0 /低字节加上高字节超过 8 位的进位highbyte=highbutr /清除高字节的进位highbyte+=(lowbyte8); /高字节加上来自低字节的进位lowby
9、te=lowbyte /清除低字节的进位4、程序流程图程序开始,初始化ch,count,sum,checksum从文件读取一个字符 chch=EOF?ch= ch 转换为相应的 8 为数据, count+count 偶数?ch 低 4 位送入 chr 高 4 位 ch 低 4 位送入 chr 低 4 位得到 chr 值(count/2)%2=1?chr 和 sum 高 8 位相加 chr 和 sum 低 8 位相加得到 sum 值将 32 位 sum 折叠到 16 位YYYNY N求 sum 反码并输出结束5、程序源代码#include#includevoid main(int argc,ch
10、ar *argv)FILE *fp;char ch;unsigned char chrl,chrh;unsigned int count=0,checksum=0,chr=0;unsigned long int sum=0;if(fp=fopen(“E:1.txt“,“r“)=NULL)/在 E 盘新建一个文本文档,命名为 1.txt,判断文件是否存在printf(“nn File cant be opened!“);exit(1);printf(“nnthe type of output:data-sumnn“);while(1)if(ch=fgetc(fp)!=EOF)count+;if(
11、ch!= )if(count%12=0)printf(“n“);if(ch=0checksum=checksumprintf(“nnsum:%1x-checksum:%x“,sum,checksum);printf(“nnsource:argc=%d,targv=%sn“,argc,argv1);fclose(fp);/关闭文件6、开发过程在整个课程设计的过程中,小组遇到了一些不大不小的问题,刚开始的时候,组长的计算机出现了问题,VC 不能够运行,再比如后来忘记在 E 盘没有新建一个文本文档时,这时系统会提示“内存不能为 read”,而在 E 盘新建了一个文件夹后,就会显示上图所示的结果。由于
12、该程序比较短,所以实现的结果就比较简单。后来还发现计算 checksum 时出了一点点小错误,但是经过改正得到了解决。后来通过向同学询问请教,自己查阅相关的资料以及上网百度,一一解决这些问题。7、程序运行情况6.1 在 E 盘建立的 1.txt 文档6.2 校验后的界面8、总结8.1 张丽丽的心得体会刚开始有点看不懂题目的意思,但看多几遍就理解了,只是在校验和与帧封装的知识有点忘记了,比如校验和是怎么得到或计算的。我是负责校验和这道题的,做这道题目之前必须对这一块知识进行详细的了解,后来我通过计算机网络这本书进行温习,让我记忆起了校验和计算的知识,其实就是反码求和,同时也通过网络的学习,加强了这方面知识的学习,如通过实例来进一步理它的原理。在实现校验和的编码上主要通过老师提供的流程图进行的,根据流程图很快就明白整个编程的思路,跟着流程图的步骤一步步进行,其中主要采取的是简单的 ifelse 语句进行编写,在这个过程中遇到很多问题,通过网络或和其他小组讨论以及师兄师姐的帮助得以解决。通过这次实验给我的最大感受就是上学期学的计算机网络这本书的知识遗忘了很多,印象比较模糊,虽然知道从这本书中学了什么但是很多细节和具体的内容已经记忆不起来了,所以知识还是需要进行温习才能巩固,通过这个实验使我对校验和有了进一步的了解和运用,在某种程度上锻炼了我的能力。