《计算机网络》计算校验和课程设计.docx

上传人:b****3 文档编号:5350568 上传时间:2022-12-15 格式:DOCX 页数:12 大小:134.82KB
下载 相关 举报
《计算机网络》计算校验和课程设计.docx_第1页
第1页 / 共12页
《计算机网络》计算校验和课程设计.docx_第2页
第2页 / 共12页
《计算机网络》计算校验和课程设计.docx_第3页
第3页 / 共12页
《计算机网络》计算校验和课程设计.docx_第4页
第4页 / 共12页
《计算机网络》计算校验和课程设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

《计算机网络》计算校验和课程设计.docx

《《计算机网络》计算校验和课程设计.docx》由会员分享,可在线阅读,更多相关《《计算机网络》计算校验和课程设计.docx(12页珍藏版)》请在冰豆网上搜索。

《计算机网络》计算校验和课程设计.docx

《计算机网络》计算校验和课程设计

目录

一.课程设计的目的和意义1

1.1课程设计的目的1

2.2课程设计的意义1

二.程设计的内容和要求2

2.1课程设计的内容2

2.2课程设计的要求2

三、课程设计的相关技术2

3.1计算校验和2

3.1.1交换性与结合性2

3.1.2字节顺序的自主性3

3.1.3并进行计算3

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

3.2.1延迟进位法4

3.2.2反向循环法4

3.2.3合并数据拷贝法4

四.课程设计过程5

4.1数据的输入方式5

4.2校验和的计算5

4.3程序流程图7

五.相关扩展8

5.1主要的实现过程8

5.2程序流程图9

六.编程实现10

6.1程序源代码10

七.程序的调试及分析13

八.课设计小结14

九.参考文献15

一.课程设计的目的和意义

1.1课程设计的目的

网络上的信号最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。

为了保证数据的正确性,在物理层的基础上设计了数据链路层。

设计数据链路层的主要作用就是在原始的、有差错的物理传输线路的基础上,采用差错检测、差错控制与流量控制等方法,将有差错的物理线路改进成逻辑上无差错的数据链路,以向网络层提供高质量的服务。

本课程设计主要通过一个简单例子使学生了解网络协议中校验和的计算过程,以及设置校验和的作用。

目前,进行差错检测和差错控制的主要方法是:

在需要传输ude数据分组后面加上一定的冗余信息,这样的冗余信息通常都是通过对所发送的数据应用某种算法进行计算而得到的。

数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较,如果结果不同就说明出现了差错,此时可以要求发送方重传该组数据,以此达到保证数据准确性的目的。

在普遍使用的网络协议中都设置了校验和项以保存这些冗余信息,例如Ipv4、ICMPv4、IGMPV4、UDP和TCP等等。

2.2课程设计的意义

《计算机网络课程设计》是计算机网络课程的一个延续,是计算机网络工程专业的一门专业实践课,其主要内容是使用C++实现理论课讲授的网络技术,如校验和法的验证等。

课程设计所涉及的工作过程主要包括熟悉网络知识的原理,逻辑设计,使用C++编码实现,调试和分析等。

通过本课程设计,使学生全面了解和掌握计算机网络课程上讲述的相关原理,并提高使用C++解决相关问题的能力。

该课程设计能够提高学生网络工程的应用能力,可以提高分析问题和解决问题的能力和团队协作的能力。

二.程设计的内容和要求

2.1课程设计的内容

计算校验和的算法称为网际校验和算法,简单来说,就是把被校验的数据按16位进行累加,然后取反码。

若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。

关于计算校验和算法更详细的信息请参考RFC1071。

2.2课程设计的要求

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

(1)以命令行形式运行:

check_suminfile

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

(2)输出:

数据文件的校验和。

三、课程设计的相关技术

3.1计算校验和

有很多数学方法可以用来提高校验和的计算速度,下面我们将就此展开讨论。

3.1.1交换性与结合性

因为校验和主要考虑被校验数据中所包含字节数量的是奇数还是偶数,所以校验和的计算可以以任意顺序进行,甚至可以把数据进行分组后再计算。

例如,用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]

的形式进行计算。

3.1.2字节顺序的自主性

打破被校验数据中的字节顺序仍可以计算出正确的16位校验和。

例如,我们交换字节组中两字节的顺序,得到

[B,A]+’[D,C]+’……+’[Z,Y][4]

所得到的得结构与[1]式是相同的(当然结果也是要进行一次反转的)。

为什么会是这样呢?

我们发现两种顺序获得的进位是相同的,都是从第15位到第0位进位以及从第7位到第8位进位。

这也就是说,交换字节位置只是改变高低位字节的排列顺序,但并没有改变它们的内在联系。

因此,无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出来。

例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网络序(低位字节在前高位字节在后)存放在内存中。

每一个16位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原本以网络序存储的数据帧中的校验和项保持一致了。

3.1.3并进行计算

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

由于加法所具有的结合性,我们没有必要按照顺序对每个字节进行累加。

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

并行地计算校验和只是增加了每次累加的信息长度。

例如,在一个323位的机器上,我们可以一次增加4个字节,即[A,B,C,D]+’……。

计算结束后再把累加和“折叠”起来,把一个32位的数值变为16位,这样产生的新的进位也要循环累积起来。

此外,在此仍不考虑字节顺序的问题,我们可以用’[D,C,B,A]+’……或[B,A,D,C]+;……这样的顺序来计算校验和,最终再通过交换16位校验和中的字节序来得到正确的值。

这些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。

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

3.2.1延迟进位法

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

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

这种方法避免了累加器中进位传感器机构的设置,但是它要求的容量是原来的累加器容量的两倍,因此它更多地依赖于硬件条件。

3.2.2反向循环法

这种方法可以减少由循环而产生的负荷,有效地展开内部的累加循环,把循环过程中的一系列加法命令复制下来。

这种技术通常可以节省大量的时间,但是程序的逻辑设计会比较复杂。

3.2.3合并数据拷贝法

计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这样会占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶颈,尤其是对于某些机器(如一些简单的慢速的微型机)来说,这一问题尤为严重。

为了解决这个问题,可以把数据读入的过程与校验的过程合二为一,也就是在读入数据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。

四.课程设计过程

校验和的计算过程主要分为三个步骤:

数据文件的输入,校验和的计算和校验结果的输出。

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

4.1数据的输入方式

输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换。

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

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

ch-=’0’;

else

if(ch>=’a’&&ch<=’f’)

ch=ch-‘a’+10;

else

if(ch>=’A’&&ch<=’F’)

ch=ch-‘A’+10;

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

Ifstreamin(argv[1],ios:

:

nocreate);

i.setf(ios:

:

hex);

4.2校验和的计算

校验和算法是本程序的核心部分,在2.5节中我们介绍了一些相关的算法,而应用最为普遍的是端循环进位法。

端循环进位的算法如下:

将数据按一定数位进行累加,最高位的进位则循环加入最低位。

待校验的数据按16位为一个单位相加,采用端循环进位,最后对所得16位的数据取反码。

因为待校验的数据是以字节方式分隔的,所以为了方便,将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);//高字节加上来自低字节的进位

lowbyte=lowbyte&0xff;//清除低字节的进位

}

 

4.3程序流程图

图4-1给出了一个流程的参考方案。

 

图4-1程序流程图

五.相关扩展

前面我们提到,校验和还有其他一些计算方法,下面我们就来简要介绍以下利用延迟进位法进行计算的方法。

延迟进位法的算法描述:

将进位累加的过程延迟到整个累加循环结束之后进行,这样可以提高计算速度。

5.1主要的实现过程

while(!

infile.eof())//判断文件是否结束,若否则对被校验的16位数据进行累加

{

inth,1;//分别表示16位数据的高8位和低8位

infile>>hex>>h;//从文件中读入一个16进制表示的数据,作为高8位

if(infile.eof())l=0;//若后面没有其他数据,将0作为低8位

elseinfile>>hex>>1;//若后面还有数据,读入下一个作为低8位

sum+=(h*256+l);//将组合好的16位数据累加到sum中

}

infile.close();//关闭文件

check_sum=short((sum&0xffff)+(sum>>16));

//将32位累加和转换为16位数据

//若累加过程中有向高16位的进位,则要将进位部分加到低16位上

check_sum=-check_sum;//对累加和取反码

 

5.2程序流程图

图4-2给出了一个相关扩展的流程图。

 

图4-2相关扩展的流程图

六.编程实现

6.1程序源代码

//在E盘新建一个文本文档,命名为1.txt(这一步非常重要)

#include

#include

voidmain(intargc,char*argv[])//¼ÆËãУÑéºÍ

{

FILE*fp;

charch;

unsignedcharchrl,chrh;

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

unsignedlongintsum=0;

if((fp=fopen("E:

\\1.txt","r"))==NULL)

{

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

exit

(1);

}

printf("\n\nthetypeofoutput:

data---sum\n\n");

while

(1)

{

if((ch=fgetc(fp))!

=EOF)

{

count++;

if(ch!

='')

{

if(count%12==0)

{

printf("\n");

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

{

ch-='0';

}

else

{

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

{

ch=ch-'a'+10;

}

else

{

if(ch>='A'&&ch<='F')

{

ch=ch-'A'+10;

}

}

}

}

if(count%2==1)

{

chrh=ch<<4;

}

else

{

chrl=ch&0x0f;

chr=chrh|chrl;

if(count%4==2)

{

sum+=chr<<8;

}

else

{

if(count%4==0)

{

sum+=chr;

}

printf("%x--%1x",chr,sum);

}

}

}else

{

count--;

}

}

else

{

break;

}

}

if(sum>>16)

checksum=(long(sum>>16)+long(sum&0x0000ffff));

checksum=checksum&0x0000ffff;

printf("\n\nsum:

%1x---checksum:

%x",sum,checksum);

printf("\n\nsource:

argc=%d,\targv=%s\n",argc,argv[1]);

fclose(fp);

}

七.程序的调试及分析

程序运行结果如下:

图7-1运行结果示意图

在E盘下建立的1.txt文档的内容如下:

图7-21.txt

遇到的问题:

在调试程序的过程中,我遇到了不少的问题,比如在E盘没有新建一个文本文档时,这时系统会提示“内存不能为read”,而在E盘新建了一个文件夹后,就会显示上图所示的结果。

由于该程序比较短,所以实现的结果就比较简单。

后来还发现计算checksum时出了一点点小错误,但是经过改正得到了解决。

解决办法:

通过向同学询问请教,自己查阅相关的资料以及上网XX,解决了该问题。

八.课设计小结

本次计算机网络课程设计维持了一周的时间,通过这次的课程设计,使我对网络协议中校验和的设置与计算有了很好的理解与掌握,拓宽了我网络方面的知识,同时也加强了我程序设计的能力,不得不说这次的课程设计让我收获很大。

本次课程设计主要是完成校验和的计算,由于之前对这方面的知识了解不是很多,所以在课设刚开始的我们都不知道从何入手,随后我结合老师发给我们的资料对校验和做了进一步的了解,才对校验和的知识有了一定的掌握,并且知道了设置校验和的作用。

计算校验和的算法其实就是把被校验的数据按16位进行累加,然后取反码。

若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。

有了思路,程序的设计就变得容易许多,加上一些关键代码的提示,很快我就把整个程序的基本代码都完成了。

当然在调试的过程中还是出现了一点问题,不过在老师和同学的耐心帮助下最后我还是把程序给调试出来了。

一周的课程设计使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助过我的同学。

同时,让我知道课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。

通过这次课程设计使我明白了自己原来知识还比较欠缺。

自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。

通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。

在整个设计中我懂得了许多东西,也培养了我独立学习工作的能力,树立了对自己学习工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。

而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。

虽然这个设计做的并不是最好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。

 

九.参考文献

[1]谢希仁.计算机网络(第5版).电子工业出版社,2008年01月

[2]叶树华,高志红.网络编程实用教程.人民邮电出版社,2006年10月

[3]白涛.网络工程实施技术与方案大全.电子工业出版社,2008年06月

[4]乔正洪,葛武滇.计算机网络技术与应用.清华大学出版社,2008年01月

[5]张国清.网络设备配置与调试项目实训.电子工业出版社,2008年05月

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 图表模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1