当前位置:文档之家› 计算机网络课程设计校验码的计算

计算机网络课程设计校验码的计算

重庆师范大学计算机网络课程设计课程名:计算校验和院系:计算机科学与技术专业:计算机科学与技术(师范)姓名:罗鹏学号:20090512145指导教师:余磊完成时间:2011年12月18日课程设计名称:计算校验和一.程设计目的: (2)二.设计要求 (3)三.设计分析(流程图、模块功能) (3)1.数据的输入方式 (3)2.校验和的计算及代码 (3)四.结果(截图): (8)五.设计总结 (8)一.程设计目的:网络上的信号最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。

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

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

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

目前,进行差错检测和差错控制的主要方法是:在需要传输ude数据分组后面加上一定的冗余信息,这样的冗余信息通常都是通过对所发送的数据应用某种算法进行计算而得到的。

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

在普遍使用的网络协议中都设置了校验和项以保存这些冗余信息,例如Ipv4、ICMPv4、IGMPV4、UDP和TCP等等二.设计要求根据前面介绍的算法,编制程序为给定数据计算校验和。

(1)建立合法的ip数据文件。

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

三.设计分析(流程图、模块功能)校验和的计算主要分三个步骤:数据文件的输入,校验和的计算和校验结果的输出,主要的是数据的输入和校验和的计算过程。

1.数据的输入方式:数据源是以文档的的形式提供,文档中是一些十进制的数字。

使用C++编程时直接打开输入文件。

ifstream in("aaa.txt");//打开外部的aaa.txt文档(ip数据报文)文档如:2.校验和的计算及代码校验和的算法是本程序的核心算法,这里我采用的是一种最为简单的算法,算法的主要思想如下:(1).将所得的十进制文件转换为二进制编码(2).将所得的二进制编码重新按照所求从低到高的顺序排列(3).对二进制编码分为十组,再转换为十进制并求和。

(4)对所求的和再转换为二进制并求反码。

具体的代码及解释如下:#include"iostream"#include"fstream"#include"sstream"#include<stdio.h>#include<stdlib.h>#include<math.h>//#include"vector"using namespace std;void xiaoyanmahe(int b[10]) //效验码函数{int x=0,c[1000],g[1000];for(int i=0;i<16;i++){c[x++]=b[10]%2;b[10]/=2;}--x;cout<<"转换为二进制:";while(x>=0)cout<<c[x--];cout<<endl<<" "<<"取反码:";for(int j=0;j<16;j++){if(c[j]==0)g[j]=1;if(c[j]==1)g[j]=0;}j--;while(j>=0)cout<<g[j--];}void erzhuanshi(int f[]) //二进制转换为十进制求和{int b[10],j=0;b[10]=0;for(int k=0;k<10;k++){j=k*16;b[k]=f[j]*pow(2,(j-16*k))+f[j+1]*pow(2,(j+1-16*k))+f[j+2]*pow(2,(j+2-16*k))+ f[j+3]*pow(2,(j+3-16*k))+f[j+4]*pow(2,(j+4-16*k))+f[j+5]*pow(2,(j+5-16*k))+f[j+6]*pow(2,(j+6-16*k))+f[j+7]*pow(2,(j+7-16*k)) +f[j+8]*pow(2,(j+8-16*k))+f[j+9]*pow(2,(j+9-16*k))+f[j+10]*pow(2,(j+10-16*k))+f[j+11]*pow(2,(j+11-16*k))+f[j+12]*pow(2,(j+12-1 6*k))+f[j+13]*pow(2,(j+13-16*k))+f[j+14]*pow(2,(j+14-16*k))+f[j+15]*pow(2,(j+15-16*k));//cout<<b[k]<<" ";b[10]+=b[k];}cout<<endl<<"所求的效验和和十进制表示为:"<<b[10]<<endl;xiaoyanmahe( b);//校验码函数}void main() //主函数{int x=0,i=0,j=-1,c[1000],d[1000],f[1000];int n[]={4,4,8,16,16,4,12,8,8,16,8,8,8,8,8,8,8,8};//定义每个ip数据报所占的位数cout<<"************"<<" "<<"************"<<endl<<" "<<"小罗制作"<<endl<<"************"<<" "<<"************"<<endl<<endl;ifstream in("aaa.txt");//打开外部的aaa.txt文档(ip数据报文)for(int a;in>>a;){//cout<<"yuanwendangdeshu "<<a<<" ";//i++;//cout<<"dang qian de i="<<i<<endl;j+=n[i];for(int b=0;b<n[i];b++) //将数据报文转换为二进制和改变二进制的排列{//j+=n[i];c[x]=a%2;d[j]=c[x];x++;j--;a/=2;}j+=n[i];i++;}--x;cout<<"原来所得的二进制:"<<endl;while(x>=0)cout<<c[x--];cout<<endl<<"校正位置后的二进制编码低到高:"<<endl;int p=159;for(int e=0;e<160;e++)//将二进制的首尾一次交换放入另一个数组,便于后面的计算{f[p]=d[e];cout<<d[e];p--;}cout<<endl;erzhuanshi(f);//二进制转换为十进制求和}图4-2给出了一个相关扩展的流程图。

四.结果(截图):所输入数据为课本176页4-13的ip数据报文。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最后,我的这个程序中间是有漏洞,在debug文件中单独打开会报错误,但是将源程序运行又可以,对于这点我感到抱歉,如广大亲们找到解决的方法和我联系,qq:873893558.谢谢。

相关主题