计算机网络课设,计算校验和

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

摘要

1 课程设计目的 (1)

2 课程设计要求 (1)

1 课程设计目的

校验和是用于验证数据传输正确性的一种方法。在网络体系结构的各层协议中,

很多网络协议都利用校验和来实现差错控制功能。本课程设计主要目的是通过完

成一个简单例子,了解网络协议中的校验和计算过程。

2 课程设计要求

1

1

2

1)交换性和结合性

因为校验和主要考虑被校验数据中所包含字节的数量是奇数还是偶数,所以校验和的计算可

以以任意顺序进行,甚至可以把数据进行分组后再计算。

例如,用A,B,C,D,……,Y,Z分别表示一系列八位组,用[a,b]这样的字节来表示a*256+b的整数,那么16位校验和就可以通过以下形式给出:

[A,B]+’[C,D]+’……+’[Y,Z] [1]

[A,B]+’[C,D]+’……+’[Z,0] [2]

在这里+’代表1补数加法,即将前面的16位校验和和按位取反。

[1]可以以

[A,B]+’[C,D]+’……+’[J,0]+’([0,K]+’……+’[Y,Z]) [3] 的形式进行计算。

2)字节顺序的自主性

打破被校验数据中的字节顺序仍可以计算正确的16位校验和。

例如,我们交换字节组中两字节的顺序,得到

[B,A]+’[D,C]+’……+’[Z,Y]

所得到的结构与[1]式是相同的(当然结果也是要进行一次反转的)。为什么会是这样呢?我们发现两种顺序获得的进位是相同的,都是从第15位到第0位进位以及从第7位到第8位进位。这也就是说,交换字节位置只是改变高低位字节的排列顺序但并没有改变他们的内在联系。因此无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出来。例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网络序(低位字节在前高位字节在后)存放在内存中。每一个16位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入

3

这些改

3

1

2

3

和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。

4课程设计分析

校验和的计算过程主要分为三个步骤:数据文件的输入、校验和的计算和校验结果的输出。其中,

主要的是输入和校验和的计算。

⒈数据输入的方式

输入数据可能是由字符型式存储的,而校验和的计算则要采取数据形式,所以在文件读取数据时,都要进行字符到数据的相互转换。

⑴将读入的ASCII码转化为相应的整型变量。

if(ch>=’0’&&ch<=’9’)

ch-=’0’;

else

{

If( ch>=’a’&&ch<=’f’)

}

{

{

}

⒊程序流程图

cout << "请输入数据" << endl;

string in, out;

cin >> in;

int ans = 0, p = 0;

sum(ans, p, in);

ans = 65535 - ans;//计算校验和,取反码

cout << "校验和为" << ans << endl;

//将数据输出到文件

fstream file("g://file.txt", std::ios::binary|std::ios::out);

if (!file)

{

cout << "打开文件失败" << endl;

return;

}

file << in << endl<

file.close();

}

/*****************接收端*************************/

#include

#include

#include

#include

using std::string;

using std::cin;

using std::cout;

using std::endl;

using std::fstream;

int cal(int &ans, int& p, string str);

void main()

{

string in;

int check;

fstream file("g://file.txt", std::ios::binary | std::ios::in);

if (!file)

{

cout << "打开文件失败" << endl;

}

int cal(int &ans, int& p, string str)

{

int deal;

int temp1, temp2;

if (p == str.size())//如果该次递归没有字符

{

return ans;

}

temp1 = str[++p];

temp1 = temp1 << 7;

if (p == str.size())//如果该次递归只有一个字符{

ans += temp1;

return ans;

}

temp2 = str[++p];

deal = temp1 + temp2;

ans += deal;

if (ans > 65536)//如果发生进位,则溢位

ans -= 65536;

return cal(ans, p, str);

}

6运行结果与分析

发送端:

输入数据

图6-1

将输入的数据存入文件

相关文档
最新文档