计算机网络课程设计校验码的计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆师范大学
计算机网络课程设计
课程名:计算校验和
院系:计算机科学与技术
专业:计算机科学与技术(师范)
姓名:罗鹏
学号: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
#include
#include
//#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< cout< 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< } 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[10]+=b[k]; } cout< 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<<"************"<<" "<<"************"< ifstream in("aaa.txt");//打开外部的aaa.txt文档(ip数据报文) for(int a;in>>a;) { //cout<<"yuanwendangdeshu "< //i++; //cout<<"dang qian de i="< j+=n[i]; for(int b=0;b //j+=n[i]; c[x]=a%2; d[j]=c[x]; x++; j--; a/=2; } j+=n[i];