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

下载本文档

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

文档简介

其次章计算校验和

2.1课程设计的目的

网络上的信号最终都是通过物理传输线路进行传输的,假如高层没有采纳差

错掌握,那么物理层传输的数据信号是可能有差错的。为了保证数据的正确性,

在物理层的基础上设计了数据链路层。设计数据链路层的主要作用就是在原始

的、有差错的物理传输线路的基础上,采纳差错检测、差错掌握与流量掌握等方

法,将有差错的物理线路改进成规律上无差错的数据链路,以向网络层供应高质

量的服务。本课程设计主要通过一个简洁例子使同学了解网络合同中校验和的计

算过程,以及设置校验和的作用。

目前,进行差错检测和差错掌握的主要方法是:在需要传输的数据分组后面

加上肯定的冗余信息,这样的冗余信息通常都是通过对所发送数据应用某种算法

进行计算而得到的。数据的接收方在接收到数据后进行同样的计算再与收到的冗

余信息进行比较,假如结果不同就说明消失了差错,此时可以要求发送方重传该

数组数据,以此达到数据精确性的目的。

在普遍使用的网络合同中都设置了校验和项以保存这些冗余信息,例如IPv4、

ICMPv4、IGMPv4、ICMPv6>UDP和TCP等等。

计算校验和的算法称为国际校验和算法,简洁来说,就是把被校验的数据按

16位进行累加,然后取反码。若数据字节长度为奇数,则在这数据尾部补一个

字节的以凑成偶数。关于计算校验和算法更具体的信息请参考

0RFC1071o

2.2课程设计要求

依据前面介绍的算法,编制程序为给定数据计算校验和。

1)以命令形式运行:check_suminfile

其中checksum为程序名,infile为输入数据文件名。

2)输出:数据文件的校验和。

2.3相关学问

lo计算校验和

有许多数学方法可以用来提高校验和的计算速度,卜面我们将就此绽开

争论。

(1)交换性与结合性

由于校验和主要考虑被校验数据中所包含字节数量的是奇数还是偶数,

所以校验和的计算可以任意挨次进行,甚至可以把数据进行分组后再计

算。

例如,用A,B,C,D......YZ分别表示一系列八位组,用⑶b]这样形式的字节

组来表示a*256+b的整数,那么16位校验和就可以通过以下形式给出:

AB]+'[C,D]+,..[YZ]

,,

[A,B]+[C,D]+....[Z/O]

在这里,+'代表1补数加法,即将前面的16位校验和按位取反。

⑴可以以

/,</

([A/B]+[CZD]+....[JZO])+([0,K]+…+[切)

的形式进行计算。

(?)字节挨次的自主性

打破被校验数据中的字节挨次仍可以计算处正确的16位校验和。

例如,我们交换字节组中两字节的挨次,得到

[B,A]+/[D,C]+,……以Z,Y]

所得到的结果与⑴式是相同的(当然结果也是要进行一次反转的)。为什

么会是这样的呢?我们发觉两种挨次获得的进位是相同的,都是从第15

位到第0位进位以及从第7位到第8位进位。这也就是说,交换字节位

置只是转变凹凸字节的排列挨次,但并没有转变它们内在联系。

因此,无论底层的硬件设置中对字节的接收挨次如何,校验和都可以被

精确地校验出来。例如,假设校验和是以主机序(高位字节

在前低位字节在后)L算地数据帧,但以网络序(低位字节在前高位字

节在后)存放在内存中的。每一个16位的字中字节在传送过程中都交换

了挨次,在计算机校验和之后仍会先交换位置再存入内存,这样就与接

收到的原本以网络序存储的数据帧中的校验和保持全都了。

(3)并行计算

某些机器的字处理长度是16位的整数倍,这样可以提高它的计算速度。

由于加法所具有的结合性,我们没有必要依据挨次对每个字节进行累加。

相反,我们可以采用这一特点对它们进行并行累加。

并行计算校验和只是增加了每次累加的信息长度。例如,在一个32位的

机器上我们可以一次增加4各字节,即[A,B,C,D]+:。计算结束后再把累

加和〃折会”起来把一个32位的数值变为16位,这样产生的新的进位也

要循环累积起来。

此外,在此仍补需考虑字节挨次的问题,我们可以用'[D,C,B,A]+1…或

[B,A,C,D]+1..这样的挨次来计算校验和,最终再通过交换16位校验和中的

字节序来得到正确的值。这些转变挨次的方法都是为了让全部的偶数字

节进入一个校验和字节,全部的奇数字节进入一个校验和字节,全部的

奇数字节进入一个校验和字节。

2示例

下面将通过一个简洁的例子来演示通过上述的几种方法所得到的校验和

的状况C

16位

按字节累加“正常”挨次交换挨次

字节0/1000100010100

字节羽f203f20303f2

字节转f4f5f4f5f5f4

字节的f6f7f6f7f7f6

合计1:2dcIfO2ddf0lf2dc

defOddfOf2dc

进位:1221

合计2:ddf2ddf2f2dd

最终结果:ddf2ddf2ddf2

32位

按字节累加“正常”挨次交换挨次

字节o/x姐:0001f203010003f203f20220

字节*S:f4f5f6f7f5f4f7f6f7f6f5f4

合计1:0f4fe8faOf6f4fbe8Ofbe8f6f4

进位:000

前半段:f4f7f6f4fbe8

后半段:e8fafbe8f6f4

合计2:lddfllf2dclf2dc

ddflf2dcf2dc

进位:111

合计3:ddf2f2ddf2dd

最终结果:ddf2ddf2ddf

还有个例子是把计算工作分成两组,其次组以奇数边界起始的

按字节累加“正常”挨次

字节0/1:00010001

字节的f2(00)f200

合计:f201f201

字节转:03f403f4

字节的:f5f6f5f6

字节夕:f7(00)f700

合计2:IfOea

合计2:fOea

进位:1

合计3:fOeb

合计1:f201

合计3:(交换字节序)ebfO

合计4:lddfl

合计4:ddfl

进位:1

合计5:ddf2

3一些编码技术可以提高校验和的计算速度

(1)延迟进位法

这种方法主要在累加循环结束之后再把进位值累加进和值。

其实现方式就是用32位的累加器获得16位的校验和,这样溢出就产生在高16

位上。这种方法避开了累加器中进位传感机构的设置,但是它要求的容量是原来

累加器容量的两倍,因此它更多地依靠于硬件条件。

(2)反向循环法

这种方法可以削减由循环产生的负荷,有效的绽开内部的累加循环,把循环过程

中的一系列加法命令复制下来。这种技术通常可以节约大量的时间,但是程序的

规律设订•会比较简单。

(3)合并数据拷贝法

计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这

样会占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶

颈,尤其是对于某些机器(如一些简洁的慢速的微型机)来说,这一问题尤为严

峻。

为了解决这个问题,可以把数据读入的过程于校验的过程合二为一,也就是在读

入数据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验

和的计算速度。

2.4课程设计分析

校验和的计算过程主要分为三个步骤:数据文件的传输,校验和的计算和校验结

果的输出。其中,主要的是数据的输入和校验和的计算过程。

1.输入数据可能是以字符的形式存储的,而校验和的计算则要采纳数据形式,

所以在从文件读取数据时,都要进行字符到数据的相互转换。

1)将读入的ASCII码转化为相应的整型变量。

if(ch>='0'&&ch<='9')

ch-='O';

else

if(ch>=/a/&&ch<=,f,)

ch=ch-'a'+lO;

else

if(ch>=/A,&&ch<=,R)

ch=ch-W+10;

2)在使用C++编程时直接使用16进制的方式打开输入文件。

Ifstreamin(argv[l],ios::nocreate);

In.setf(ios::hex);

3)校验和的计算

校验和算法是本程序的核心部分,在2.5节中我们介绍了一些相关的算法,而应

用最为普遍的是端循环进位法。

端循环进位的算法如下:将数据按肯定数位进行累加,最高位的进位则循环加入

最低位。

待校验和的数据按16位为一个单位相加,采纳瑞循环进位,最终对所得的16

位的数据取反码。由于校验的数据是以字节方式分隔的,所以为了便利,将16

位的数据分成高8位和低8位分别处理。该算法的代码如下:

Endarondcarry(int&highbyte,int&lowbyte)

{while(highbyte>ofxx||lowbyte>ofxx)〃高八位或低八位中任何一方产生溢出(进

位)

lowbyte+=(highbyte»8);〃低字节加上高字节超过8位的进位

highbyte+=highbyte&ofxx;〃清晰高字节的进位

highbyte+=(lowbyte»8);〃高字节加上来自低字节的进位

}

#include<stdio.h>

#include<stdlib.h>

voidmainfintargc,char*argv[])

{FILE*fp;

charch;

unsignedcharchrl,chrh;

unsignedintcount=0,checksum=0,chr=0;

unsignedlongintsum=0;

if((fp=fopen("e:\\l.txt";,r"))==NULL)

{

printf("\n\nFilecan'tbeopened");

exit(l);

)

printf("\n\nthetypeofoutput:data---sum\n\n");

while(l)

{

if((ch=fgetc(fp))!=EOF)

(

count++;

if(ch!=")

{if(count%12==0)

printf("\n");

if(ch>='0'&&ch<='9')

ch-='O';

else

if(ch>=,a'&&ch<='f')

温馨提示

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

评论

0/150

提交评论