




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.../目录摘要1课程设计目的12课程设计要求13相关知识14课程设计分析15程序代码16运行结果与分析17参考文献11课程设计目的校验和是用于验证数据传输正确性的一种方法。在网络体系结构的各层协议中,很多网络协议都利用校验和来实现差错控制功能。本课程设计主要目的是通过完成一个简单例子,了解网络协议中的校验和计算过程。2课程设计要求根据校验和的算法,编写程序为给定数据计算校验和以命令行形式运行:Checksuminput_file其中Checksum为程序名,input_file为输入数据文件名2>输出内容:数据文件的校验和相关知识1校验和的概念网络上的数据最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的线路可能有差错。为了保证传输数据的正确性,在物理层的基础上设计了数据链路层。设计数据链路层的主要目的就是在原始的,有差错的物理传输线路的基础上,采用差错检测,差错控制和流量控制等方法。目前,进行差错检测和控制的主要方法是:发送方在需要发送的数据后面增加一定的冗余信息,这些冗余信息通常是通过对发送的数据进行某种算法计算而得到的。接收方对接收数据进行同样的计算,然后与数据后面附加的冗余信息进行比较,如果比较结果不同就说明在传输中出现了差错,并要求发送方重新传送该数据,以此达到确保数据准确性的目的。在普遍使用的网络协议中,通常都设置了校验和字段以保存这些冗余信息,计算这些校验和的算法,就是将被校验的数据按16位进行累加,然后取反码,如果数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。关于计算校验和算法的详细信息请参考RFC1071.2计算校验和有很多数学方法可以提高校验和的速度。交换性和结合性因为校验和主要考虑被校验数据中所包含字节的数量是奇数还是偶数,所以校验和的计算可以以任意顺序进行,甚至可以把数据进行分组后再计算。例如,用A,B,C,D,……,Y,Z分别表示一系列八位组,用[a,b]这样的字节来表示a*256+b的整数,那么16位校验和就可以通过以下形式给出:[A,B]+’[C,D]+’……+’[Y,Z][1][A,B]+’[C,D]+’……+’[Z,0][2]在这里+’代表1补数加法,即将前面的16位校验和和按位取反。[1]可以以[A,B]+’[C,D]+’……+’[J,0]+’<[0,K]+’……+’[Y,Z]>[3]的形式进行计算。字节顺序的自主性打破被校验数据中的字节顺序仍可以计算正确的16位校验和。例如,我们交换字节组中两字节的顺序,得到[B,A]+’[D,C]+’……+’[Z,Y]所得到的结构与[1]式是相同的〔当然结果也是要进行一次反转的。为什么会是这样呢?我们发现两种顺序获得的进位是相同的,都是从第15位到第0位进位以及从第7位到第8位进位。这也就是说,交换字节位置只是改变高低位字节的排列顺序但并没有改变他们的内在联系。因此无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出来。例如,假设校验和是以主机序〔高位字节在前低位字节在后计算的数据帧,节在后存放在内存中。每一个16位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原本以网络序存储的数据帧中的校验和项保持一致了。并行计算某些机器的字处理长度是16位的倍数,这样可以提高他的计算速度。由于加法所具有的结合性,我们没有必要按照顺序对每个字节进行累加。相反,我们可以利用这一特点对他们进行并行累加。并行地计算校验和只是增加了每次累加信息的长度,例如,在一个32位的机器上,我们可以一次增加4个字节,即[A,B,C,D]+...。计算结束后再把累加和"折叠"起来,把一个32位的数值变成16位,这样产生的新的进位也要循环累加起来。此外,在此仍不需要考虑字节顺序问题,通过交换16位校验和中的字节序来得到正确的值。这些改变顺序的方法都是为了所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。3一些编码技术可以提高校验和的计算速度延迟进位法这种方法在主要的累加循环结束之后再把进位累加进和值。其实现方式就是用32位的累加器获得16位校验和,这样溢出就产生在高16位上。这种方法避免了累加器中进位传感器机构的设置,但是它要求的容量是原来的累加器容量的两倍,因此它更多地依赖于硬件条件。反向循环法这种方法可以减少由循环而产生的负荷,有效地展开内部的累加循环,把循环过程中的一系列加法命令复制下来。这种技术通常可以节省大量的时间,但是程序的逻辑设计会比较复杂。合并数据拷贝法计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这样会占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶颈,尤其是对于某些机器〔如一些简单的慢速的微型机来说,这一问题尤为严重。为了解决这个问题,可以把数据读入的过程与校验的过程合二为一,也就是在读入数据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。课程设计分析校验和的计算过程主要分为三个步骤:数据文件的输入、校验和的计算和校验结果的输出。其中,主要的是输入和校验和的计算。=1\*GB1⒈数据输入的方式输入数据可能是由字符型式存储的,而校验和的计算则要采取数据形式,所以在文件读取数据时,都要进行字符到数据的相互转换。=1\*GB2⑴将读入的ASCII码转化为相应的整型变量。if<ch>=’0’&&ch<=’9’>ch-=’0’;else{If<ch>=’a’&&ch<=’f’>ch=ch-‘a’+10;elseif<ch>=’A’&&ch<=’F’>ch=ch-‘A’+10;}=2\*GB2⑵在使用C++编程时直接使用16进制的方式打开输入文件。ifstreamin<argv[1],ios::nocreate>;in.setf<iso::hex>;=2\*GB1⒉校验和的计算校验和算法是本程序的核心部分,应用最普遍的是端循环进位法。端循环进位法的算法如下:将数据按一定位数进行累加,最高位的进位则循环加入最低位。待校验的数据按16位为一个单位相加,采用端循环进位,最后对所得16位的数据取反码。因为待校验的数据是以字节方式分隔的,所以为了方便,将16位的数据分成高8位和低8位分别处理。该算法的代码如下:endaroundcarry<int&highbyte,int&lowbyte>{while<highbyte>0xff||lowbyte>0xff>//高8位或低8位中的任何一方产生溢出〔进位{Lowbyte+=<highbyte>>8>;//低字节加上高字节超过8位的进位Hhighbyte+=<lowbyte>>8>;//高字节加上来自低字节的进位lowbyte=lowbyte&0xff;//清除低字节的进位}开始将文件中数据取出数据有误,丢弃输出数据检验校验和是否为零结束=3\*GB1开始将文件中数据取出数据有误,丢弃输出数据检验校验和是否为零结束开始开始请输入数据计算校验和,取反码将数据存入文件结束 是否 图4-1 图4-2程序代码/**************发送端*******************/#include<iostream>#include<string>#include<iomanip>#include<fstream>//打开文件操作usingstd::string;usingstd::cin;usingstd::cout;usingstd::endl;usingstd::fstream;intsum<int&ans,int&p,stringstr>;//声明计算校验和函数voidmain<>{ cout<<"请输入数据"<<endl;stringin,out; cin>>in;intans=0,p=0; sum<ans,p,in>; ans=65535-ans;//计算校验和,取反码 cout<<"校验和为"<<ans<<endl;//将数据输出到文件fstreamfile<"g://file.txt",std::ios::binary|std::ios::out>;if<!file> { cout<<"打开文件失败"<<endl;return; } file<<in<<endl<<ans; file.close<>; cout<<"数据已存入文件中!"<<endl;}intsum<int&ans,int&p,stringstr>//定义计算校验和函数{intdeal;//记录单次计算结果intt1,t2;if<p==str.size<>> {returnans; } t1=str[++p]; t1=t1<<7;if<p==str.size<>> {ans+=t1;returnans; } t2=str[++p]; deal=t1+t2;ans+=deal;if<ans>65536>ans-=65536;returnsum<ans,p,str>;}/*****************接收端*************************/#include<iostream>#include<string>#include<iomanip>#include<fstream>usingstd::string;usingstd::cin;usingstd::cout;usingstd::endl;usingstd::fstream;intcal<int&ans,int&p,stringstr>;voidmain<>{stringin;intcheck;fstreamfile<"g://file.txt",std::ios::binary|std::ios::in>;if<!file> { cout<<"打开文件失败"<<endl;return; } file>>in>>check; file.close<>;intans=0,p=0; cal<ans,p,in>; ans+=check; ans=65535-ans;//校验和为0,则没有错误;反之,则有if<ans> { cout<<"数据有误,丢弃!"<<endl;return; }else { cout<<"数据为:"<<endl; cout<<in<<endl; }}intcal<int&ans,int&p,stringstr>{intdeal;inttemp1,temp2;if<p==str.size<>>//如果该次递归没有字符 {returnans; } temp1=str[++p]; temp1=temp1<<7;if<p==str.size<>>//如果该次递归只有一个字符 {ans+=temp1;returnans; } temp2=str[++p]; deal=temp1+temp2;ans+=deal;if<ans>65536>//如果发生进位,则溢位ans-=6553
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一创新活动方案
- 六一商场开业活动方案
- 六一广告活动方案
- 六一活动做饺子活动方案
- 六一活动吃喝玩乐活动方案
- 六一活动捉小鸡活动方案
- 六一活动美容活动方案
- 六一烹饪活动方案
- 六一舞蹈趣味活动方案
- 六一趣味捞鱼活动方案
- 5.2做自强不息的中国人(教学设计)2024-2025学年七年级道德与法治下册(统编版2024)
- 2025 年中职高考对口升学(幼儿教育学)真题试卷附参考答案
- 2025承诺合同(个人承诺)
- 2025-2030中国智能视频行业调研分析及发展趋势预测研究报告
- 安徽省2024-2025学年八年级信息技术水平会考操作题
- 墓地征用协议书范本
- 2025年农艺工(高级)职业技能鉴定参考试题库(含答案)
- 临床气管插管拔管后吞咽障碍评估与干预实践应用
- 海南海虹化纤工业有限公司地块第二阶段土壤污染状况调查报告
- 坚持教育优先发展
- 外研版三年级下册英语全册单元测试卷(含期中期末试卷及听力音频)
评论
0/150
提交评论