计算机网络差错检验实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一差错检验
1 问题分析和需求定义
1.1问题分析
网络上的信号最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。为了保证数据的正确性,在物理层的基础上设计了数据链路层。设计数据链路层的主要作用就是在原始的、有差错的物理传输线路的基础上,采用差错检测、差错控制与流量控制等方法,将有差错的物理线路改进成逻辑上无差错的数据链路,以向网络层提供高质量的服务。
1.2需求定义
目前,进行差错检测和差错控制的主要方法是:在需要传输数据分组后面加上一定的冗余信息,这样的冗余信息通常都是通过对所发送的数据应用某种算法进行计算而得到的。数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较,如果结果不同就说明出现了差错,此时可以要求发送方重传该组数据,以此达到保证数据准确性的目的。
在本实验中我们需要完成网际校验和算法的程序实现,通过此程序对发送数据计算和添加校验码,对接收数据进行差错检测。
2 算法的原理以及实现思路
2.1 算法的原理
在需要传输的数据包中,加上一定的冗余信息。这些冗余信息通常都是对所发送的数据应用某种算法进行计算而得到的校验码。接收端:对接收到的信息(包含收到的冗余信息)用同一种算法(协议)进行计算后,得到结果为0的校验码,说明收到了正确的数据,否则收到的数据出现差错, 并将此数据报丢弃。“A,B,C,...,Y,Z”分别表示一系列8位组,用[A,B]这样形式的字节组来表示A*256+B的整数,那么该字节序列的反码和就可以通过以下两种表达式之一给出:
[A,B] +' [C,D] +' ... +' [Y,Z] [A,B] +' [C,D] +' ... +' [Y,Z]
[A,B] +' [C,D] +' ... +' [Y,Z] [A,B] +' [C,D] +' ... +' [Z,0]
其中,+' 表示反码算数运算相加,第一个公式适用于偶数个字节的校验和,第二个公式适用于计算奇数个字节的校验和。
注:把被校验的数据按16位进行累加,若有进位,将进位加至结果最低位,得16位累加
和,对16位累加和求反码,得到校验码。
2.2 算法的实现思路
校验和计算算法主要分为三个步骤:数据文件的输入、校验和的计算和校验结果的输出。其中,主要是数据的输入和校验和的计算。
2.2.1 数据的输入
在本实验中输入的数据是以字符形式存储的,而校验和的计算则要采用数据形式,所以从文件读取数据时,都要进行字符到数据的相互转换。
2.2.2 校验和的计算
本实验中采用端循环进位算法,将数据按一定数位进行累加,最高位的进位则循环加入最低位。待校验的数据按16位一个单位相加,采用端循环进位,最后对所得的数据取反码。因为待校验的数据是以字节方式分隔的,所以为了方便,将16位的数据分成高8位和低8位分别处理。
2.2.3 校验和结果的输出
使用输出语句进行输出。
3 算法实现的正确性测试
运行程序,得到CheckSum.exe文件。运行jyh.txt文件,之后得出其校验和。将得出的校验和写入jyh.txt文件中,再次运行文件,若得到的校验和为0,则无错误发生。
4 差错测试方案
如3中所实现,如果经过多次测试,算法的程序实现正确,则可以人工模拟出传输错误的数据,让接收方检测出差错。
5 程序流程图
计算机网络课程设计p16
6 程序代码分析
# include
# include
int main(int argc,char * argv[])
{
//定义并初始化变量
FILE *fp; //fp为指向文件的指针
char ch; //ch用于存放在文件中读到的一个字符
unsigned char chr1,chrh; //chr1用于存放低四位,chrh用于存放高四位
unsigned int count=0,checksum=0,chr=0; //count计数用于保存读到字符的次数,checksum用于存放校验和,chr用于存放高八位和低八位数
unsigned long sum=0; //sum用于存放十六进制数根据算法累加得到的结果
//检查输入命令格式
if(argc!=2) //如果命令行输入的参数个数不为2
{
printf("Please input command: CheckSum input_file"); //打印提示语句
return -1; //结束程序,返回-1
}
//打开文本文件
if((fp=fopen(argv[1],"r"))==NULL) ////以读形式打开文件,若返回的指针为空,则退出程序
{
printf("File cannot be oppened!\n"); //打印报错语句
return -2; //结束程序,返回-2
}
//从文本文件中读取字符
printf("Output Type: data--sum\n"); //打印提示语句
while(1) //进入一个判断条件永远为真的循环
{
if((ch = fgetc(fp)) != EOF) //从文件读取一个字符,判断是否到达文件末尾
{
count++; //count计数+1
if(ch != ' ') //判断读的字符是否是空格
{
//将字符转换成相应整型值
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;
}
}
//计算8字节数的累加值
if(count%2 == 1) //如果count为奇数
chrh = ch<<4; //将ch的数据左移4位放入chrh中,即将一个高四位赋值给chrh else //如果count为偶数
{
chr1=ch&0x0f; //将ch和0x0f进行位与运算,去掉ch的高四位,赋值给chr1
chr=chrh|chr1; //将chrh和chr1进行位或运算,也就是将chrh的高四位和chr1的低四位合并为一个八位赋给chr
if(count%4 == 2) //如果count与4取余得2
sum += chr<<8; //将chr左移八位赋值给sum ,即将一个高八位余sum相加
else //如果count与4取余不是2
{
if(count%4==0) //如果count与4取余为0
sum += chr; //将sum和chr相加赋值给sum ,即将一个低八位与sum相加
}
printf("%x---%lx ",chr,sum); //以整型的十六进制形式打印chr的值,以长整形的十六进制形式打印sum的值
}
}