计算机网络课程设计报告.docx
《计算机网络课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计报告
计算机网络课程设计
班级:
学号:
姓名:
一、课程设计的目的和意义
1.1设计目的
掌握IP地址的分类,准确理解子网、掩码的概念,确切地明了IP地址的合法格式。
并判断该地址是否属于一个给定的子网。
1.2设计的意义
1、有利于对基础知识的理解
2、有利于逻辑思维的锻炼
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。
即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
3、有利于与其他学科的整合
在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解决信息技术中比较抽象很难理解的知识。
在信息技术课中整合其它学科的知识,发挥信息技术的优势。
4、有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
这当中就有一个严谨治学、一丝不苟的科学精神的培养。
二、课程设计的内容和要求
在掌握IP地址的表示方法以及子网划分方法的基础上,并以计算机网络中关于IP地址的相关理论知识为基石,运用C/C++语言按如下要求完成程序。
1.在判断一个IP地址合法性时要自行编写代码,不要使用任何inet函数
2.命令行格式:
ip_testsubnet/maskip_addr
其中,ip_test为程序名;subnet为子网号;mask是一个整型数值,代表子网掩码连续1的个数;ip_addr表示要测试的IP地址。
比如说,要测试的IP地址为202.113.16.10,子网号码是202.113.16.0,子网掩码是255.255.255.0,则命令行为ip_test202.113.16.0/24202.113.16.10。
(因为255.255.255.0是连续的24个1,所以用24表示)
3.判断subnet和ip_addr的合法性。
在判断IP地址合法性时要自行编写代码,不要使用任何inet 函数。
判断时要考虑各种情况,全面分析问题。
例如以下IP地址均不合法:
123..2.1
123.23$.2.1
123.2345.2.1
123.23.45.1
4.判断掩码的合法性。
譬如说mask的值为负数或者大与32,这时输入的掩码就不合法。
5.在IP地址合法,掩码合法以及子网号也合法的前提下,判断ip_addr是否属于subnet。
6.输出命令行中的ip是否合法,掩码是否合法,子网号码是否合法(可适当给出不合法的原因)以及ip_addr是否属于子网subnet。
7.还可以判断子网号,主机号全0,全1问题。
课程设计一:
计算校验和
1.课程设计的目的:
网络上的信号最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。
为了保证数据的正确性,在物理层的基础上设计了数据链路层。
设计数据链路层的主要作用就是在原始的、有差错的物理传输线路的基础上,采用差错检测、差错控制与流量控制等方法,将有差错的物理线路改进成逻辑上无差错的数据链路,以向网络层提供高质量的服务。
本课程设计主要通过一个简单例子使学生了解网络协议中校验和的计算过程,以及设置校验和的作用。
目前,进行差错检测和差错控制的主要方法是:
在需要传输的数据分组后面加上一定的冗余信息,这样的冗余信息通常都是通过对所发送数据应用某种算法进行计算而得到的。
数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较,如果结果不同就说明出现了差错,此时可以要求发送方重传该数组数据,以此达到数据准确性的目的。
在普遍使用的网络协议中都设置了校验和项以保存这些冗余信息,例如Ipv4、ICMPv4、IGMPv4、ICMPv6、UDP和TCP等等。
计算校验和的算法称为国际校验和算法,简单来说,就是把被校验的数据按16位进行累加,然后取反码。
若数据字节长度为奇数,则在这数据尾部补一个字节的0以凑成偶数。
2.课程设计中的部分程序分析
校验和的计算过程主要分为三个步骤:
数据文件的传输,校验和的计算和校验结果的输出。
其中,主要的是数据的输入和校验和的计算过程。
(1)输入数据可能是以字符的形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换。
1)将读入的ASCII码转化为相应的整型变量。
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;
2)在使用C++编程时直接使用16进制的方式打开输入文件。
Ifstreamin(argv[1],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);//高字节加上来自低字节的进位
3.校验和程序的流程图:
四.程序运行结果
二:
IP地址合法性及子网判断
1、课程设计目的:
掌握IP地址的分类,准确理解子网、掩码的概念,确切地明了IP地址的合法格式。
并判断该地址是否属于一个给定的子网。
2、课程设计分析:
1.程序大致流程
1)分别判断子网号,掩码和IP地址的基本格式是否合法。
2)如果三者的基本格式都合法,才调用判定“IP地址是否为子网成员”的函数。
该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0,全1.
2.核心代码及说明
1)判断IP地址是否合法。
一般来说,我们先检查最明显的错误。
例如,可以先判断IP中”.”个数是否正确;接着,以“.”为标志将IP字符串按节分开;然后,看该IP是否为4段,再判断各节是否是0~255间的整数。
关于网络号,主机号全0全1等问题要在后面结合子网掩码一起判断。
这里的关键是怎么将IP字符串以“.”为标志按节分开,这要用到函数strtok(char*strToken,constchar*strDelimit).第一个参数是给定的串,第二个参数是分隔符集合,该函数的功能就是以strDelimit中包含的任意字符为分隔符,在strToken中寻找下一个token。
每一次调用strtok后,都会在strToken中插入一个NULL字符,所以,如果要读取下一个token,接下来调用strtok时第一个参数用NULL。
charch[]=“.”;//分隔符
char*token,*dot[4];
intiplen=0;
token=strtok(ip,ch);//以“。
”标志将IP字符串按节分开
while(token!
=NULL){//循环进行,直到结束
dot[iplen]=token;//将分开的每段赋值给dot
iplen++;
token=strtok(NULL,ch);
}
这样,IP串的每一段都放到dot数组里了,下面判断是否有非法字符,每一段的值是否在0~255之间,就很容易了。
2)判断IP地址是否为子网成员,判断子网号与掩码是否匹配,以及子网号,主机号全0,全1问题(iSubA是子网号,iMask是掩码,iIPA是给定的IP地址)。
if((iSubA|iMask!
=imask){//说明sub与mask不匹配
cout<<”子网号与掩码不匹配,error!
”<return;
}
if((iSubA^iMask)==0){//说明子网号全1
cout<<”子网号全1,error!
”<return;
}
if((iSubA&iMask)==0){//说明子网号全0
cout<<”子网号全0,error!
”<return;
}
if((iSubA)==(iIPA&iMask)){//ip和掩码做“与”运算,结果和子网号比较
if((iIPA|iMask)==iMask){//说明主机号全0
cout<<”主机号全0,error!
”<return;
}
if((iIPA|iMask)==0xffffffff){//说明主机号全1
cout<<”主机号全1,error!
”<return;
}
cout<<””<return;
}
else
cout<<””<3.设计流程图
程序运行结果
(1)在命令提示窗口中输入命令:
ip_test202.113.16.0/24202.113.16.10
结果如下:
这个结果表示所输入的子网及ip地址是合法的
(2)判断ip地址无效
①在命令提示窗口中输入命令:
ip_test202.113.16.0/24202.113.16.1%
结果如下:
该结果表示所输入ip地址无效,因为ip地址中有无效字符“%”。
②在命令提示窗口中输入命令:
ip_test202.113.16.0/24202.113.16.10.10
结果如下:
由命令可以很明显的看出ip地址过长,说明该程序算法正确。
(3)判断掩码的有效性
①在命令提示窗口中输入命令:
ip_test202.113.16.0/2a202.113.16.10
结果如下:
很显然,掩码中含有“a”,不合法。
②在命令提示窗口中输入命令:
ip_test202.113.16.0/33202.113.16.10
结果如下:
因掩码不能长于32位,上提示掩码无效进一步说明该算法的正确性。
(4)判断ip地址是否属于该子网
①在
(1)中是该ip地址属于该子网的情况
②在命令提示窗口中输入命令:
ip_test202.113.16.0/24202.113.15.10,显然该ip地址不属于该子网。
结果如下:
该结果符合我们的预想。
(5)提示子网号全0或全1
①在命令提示窗口中输入命令:
ip_test0.0.0.0/24202.113.16.10
结果如下:
②在命令提示窗口中输入命令:
ip_test255.255.255.0/24202.113.15.10
结果如下:
(6)判断主机号全0或全1
①在命令提示窗口中输入命令:
ip_test202.113.16.0/24202.113.16.0
结果如下:
②在命令提示窗口中输入命令:
ip_test202.113.16.0/24202.113.16.255
结果如下:
以上现象充分说明该算法是完全正确的。
六、课程设计小结
在这学期的计算机网络课程设计中,我学会了很多。
一开始拿到实验题目时感觉有点无从下手,后来静下心来慢慢分析这些题目,发现要用到的知识都是平时学的东西,只是程序比较复杂,要分成几个部分。
于是我在编一个程序前把程序的流程在纸上整理好,突然间也发现了流程图在这时候的重要性,因为以前编的程序大多相对简单,思路可以在脑海里记着,现在发现流程图可以把程序里面的主程序和子程序分清楚,把各个程序段的嵌套调用关系理清,这是编程序一个很好的方法。
同时还认识到学好C++实用性,在认识到这些后,我认真的投入实验中,编程,调试,修改,运行,不停的循环,枯燥但也不乏趣味,错的多也不用怕,那样你可以见到很多没见过的错误,争取以后避免。
编程,调试,修改,调试再修改,过程也许有些枯燥,但你得承认,当你运行出结果时,真的很有成就感。
通过本次课程设计最大的收获可能就是使我懂得了理论联系实际是很重要的,我们在书本上学到的知识是很基础的,而且我们对知识的掌握也是很有限的。
通过实践,在加强我们独立思考以及动手能力的同时还加深了我们对知识的理解、加强了我们对知识运用的能力。
在实践中我们可以发现自身的不足,可以通过以后的学习及锻炼及时地改正。
当然在本次课程设计过程中遇到了很大的困难,在实践的过程中遇到了各种各样的问题,在老师的指导下以及和在和同学的讨论过程中解决了这些困难和问题。