当前位置:文档之家› 计算机网络差错检验实验报告

计算机网络差错检验实验报告

计算机网络差错检验实验报告
计算机网络差错检验实验报告

实验差错检验

1问题分析和需求定义

1.1问题分析

网络上的信号最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。为了保证数据的正确性,在物理层的基础上设计

了数据链路层。设计数据链路层的主要作用就是在原始的、有差错的物理传输线路的基础上,

采用差错检测、差错控制与流量控制等方法,将有差错的物理线路改进成逻辑上无差错的数据链路,以向网络层提供高质量的服务。

1.2需求定义

目前,进行差错检测和差错控制的主要方法是:在需要传输数据分组后面加上一定的冗

余信息,这样的冗余信息通常都是通过对所发送的数据应用某种算法进行计算而得到的。数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较,如果结果不同就

说明出现了差错,此时可以要求发送方重传该组数据,以此达到保证数据准确性的目的。

在本实验中我们需要完成网际校验和算法的程序实现,通过此程序对发送数据计算和添

加校验码,对接收数据进行差错检测。

2算法的原理以及实现思路

2.1算法的原理

在需要传输的数据包中,加上一定的冗余信息。这些冗余信息通常都是对所发送的数据应用某种算法进行计算而得到的校验码。接收端:对接收到的信息(包含收到的冗余信息)用同一种算法(协议)进行计算后,得到结果为o的校验码,说明收到了正确的数据,否则

收到的数据出现差错,并将此数据报丢弃。“ 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

{ 一 prin tf("Please in put comma nd: CheckSum in put_file"); // 打印提示语句 return -1; 〃结束程序,返回-1 }

〃打开文本文件

if((fp=fope n(argv[1],"r"))==NULL)

{

prin tf("File cannot be oppe ned!\n");

retur n -2;

}

〃打印提示语句 〃进入一个判断条件永远为真的循环 //从文件读取一个字符,判断是否到达文件末尾 //cou nt 计数 +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字节数的累加值

〃将chr 左移八位赋值给sum ,即将一个高八位余 sum 相加 〃如果count 与4取

余不是2 {

if(count%4==0) 〃如果 count 与 4 取余为 0

sum += chr; 〃将sum 和chr 相加赋值给sum ,即将一个低八位与 sum 相加

}

printf("%x---%lx ",chr,sum); //以整型的十六进制形式打印

chr 的值,以长整形的十六进制形

式打印sum 的值 ////以读形式打开文件,若返回的指针为空,则退出程序 〃打印报错语句 〃结束程序,返回-2

〃从文本文件中读取字符 prin tf("Output Type: data--

sum\n"); while(1)

{

if((ch = fgetc(fp)) != EOF)

{

coun t++;

if(co un t%2 == 1) 〃如果cou nt 为奇数 chrh = ch<<4; else 〃将ch 的数据左移4位放入chrh 中,即将一个高四位赋值给 chrh 〃如果count 为偶数 { 位合并为一个八位赋给 chr

chr 仁ch&0x0f; 〃将ch 和0x0f 进行位与运算,去掉 ch 的高四位,赋值给 chr1 chr=chrh|chr1; 〃将chrh 和chr1进行位或运算,也就是将chrh 的高四位和chr1的低四 if(co un t%4 == 2) 〃如果cou nt 与4取余得2

sum += chr<<8; else

checksum=?(long(sum>>16)+long(sum&OxOOOOffff));

//将校验和由 32 位折合成 16 位,取反 checksum=checksu m&OxOOOOffff;

printf("\nCheckSum: %4x",checksum); 〃输出校验和结果

return 0;

} 7差错检查过程及其结果分析

7.1测试数据 本次实验共准备了三组数据。

1.abcd 1234 5678 bcde

2. bdf1 5a34 d223 dabc

3. fcb1 a3bd 4aec 4dab

7.2程序运行方式

本实验中程序在命令行下执行, win+R 输入cmd 打开命令行窗口,进入程序所在的目 录,输入check_sum in file ,其中check_sum 为程序名,in file 为数据文件名,需要注意的是 文件应和程序在同一目录下。

7.3运行结果

第一组数据打印输出为:2ea7

第二组数据打印输出为:3af9

第三组数据打印输出为:c6f8

7.4结果分析

将7.3中得到的校验和添加到各组数据的末尾,再次运行程序,打印输出的数据如下: 第一组:0

第二组:0

第三组:0.

} else 〃如果读到文件末尾

} fclose(fp); break; 〃结束循环

〃关闭资源

else

count--;

//如果读到的字符是空格 //count 减一

〃结束程序

7.5遇到的问题及解决方案

1. 最初运用cmd运行jyh文件时打不开

解决方案:注意到要和che ncksum.exe文件存放在同一文件夹中

2. 没有弄清计算原理

解决方案:与同学讨论掌握了校验和及算法中的计算原理

相关主题
文本预览
相关文档 最新文档