沈阳理工大学课程设计专用纸
Noi
成 绩 评 定 表
学生姓名
班级学号
专 业 计算机科学
课程设计题目 计算校验和
与技术
评
语
成绩
日期
组长签字:
2012 年 12 月 3 日
沈阳理工大学
沈阳理工大学课程设计专用纸
Noii
课程设计任务书
专 业
班级学号
计算校验和
学 院
学生姓名
课程设计题目
实践教学要求与任务:
1 本课程以教师教授和学生自学同步的方式,学校可提供上机操作,提高实际操
作,设计能力。主要功能为布置不同的题目设计程序,实现程序。
2 在完成基本技巧的讲解后,学号尾号相同的同学自行分成一组,学生独立完成。
3 教师面对面当场检查学生掌握程序的情况,根据学生的学习情况,
及题目的完成情况给相应的成绩。
工作计划与进度安排:
第 15 周
星期一:设计任务分析和总体设计
星期二:软件算法和流程设计
星期三:软件编码实现
星期四:软件总体调试
星期五:交课程设计报告、答辩、验收程序
指导教师:
专业负责人:
学院教学副院长:
2012 年 12 月 日
2012 年 12 月 日
2012 年 12 月 日
沈阳理工大学
沈阳理工大学课程设计专用纸
Noiii
目 录
摘 要
1 课程设计目的………………………………………………1
2 课程设计要求………………………………………………1
3 相关知识……………………………………………………1
4 课程设计分析………………………………………………4
5 程序代码……………………………………………………8
6 运行结果与分析……………………………………………11
7 参考文献……………………………………………………12
8 收获…………………………………………………………13
沈阳理工大学
沈阳理工大学课程设计专用纸
No1
1 课程设计目的
校验和是用于验证数据传输正确性的一种方法。在网络体系结构的各层协议中,很多
网络协议都利用校验和来实现差错控制功能。本课程设计的主要目的是通过完成一个简单
例子,了解网络协议中的校验和的计算过程。
2 课程设计要求
根据后面介绍的校验和算法,编写程序为给定程序计算校验和。
1)以命令和形式运行:
Main 1-file
其中 main 为程序名,1-file 为输入数据文件名。
2)输出内容:数据文件的校验和。
3 相关知识
1. 校验和的概念
网络上的数据最终都是通过物理传输线路进行传输,如果高层没有采用差错控制,
那么物理层传输的数据可能有差错。为了保证传输的数据的正确性,在物理层的基础
上设计了数据链路层。设计链路层的目的就是在原始的·有差错的物理传输线路的基
础上,采用差错检测·差错控制与流量控制等方法,将有错的物理线路改进成逻辑上
无差错的数据链路,以向网络层提供高质量的服务。
目前,进行差错检测和控制的主要方法是:发送方在需要发送的数据后面增加一定的
冗余信息,这些冗余信息通常是通过对发送的数据进行某种算法计算而得到的。接收方对
接收数据进行同样的计算,然后与数据后面附加的冗余信息进行比较,如果比较结果不同
就说明在传输中出现了差错,并要求发送方重新传送该数据,以此达到确保数据准确性的
目的。
在普遍使用的网络协议(例如 IP ICMP IGMP UDP 与 TCP 等)中,通常都设置了
沈阳理工大学
沈阳理工大学课程设计专用纸
No2
校验和字段以保存这些冗余信息。计算这些校验和的算法成为网络校验和算法,就是将被
校验的数据按 16 位进行累加,然后去取反碼,如果数据字节长度为奇数,则数据尾部补
一个字节的 0 以凑成偶数。关于计算校验和算法的详细信息请参考 RFC1071.
2. 关于计算校验和
有很多数学方法可以用来提高校验和的计算速度,下面我们将就此展开讨论。
(1) 交换性与结合性
因为校验和主要考虑被校验数据中所包含字节的数量是奇数还是偶数,所以校验和的
计算可以任意进行,甚至可以把数据进行分组后再计算。
例如用 A,B,C,D,····Y , Z 分别表示一系列八位组,用【a,b】这样的形式的字样
组来表示 a*256+b 的整数,那么 16 位校验和就可以通过以下形式给出:
【A,B】+【C,D】+····+【Y,Z】
【A,B】+【C,D】+····+【Z,0】
在这里,+代表 1 补救加法,即将前面的 16 位校验和按位取反。
【1】 可以以
(【A,B】+【C,D】+···+【J,O】+【O,K】+···+【Y,Z】)
的形式进行计算。
(2)字节顺序的自主性
打破被校验数据中的字节顺序仍可以计算出正确的 16 位校验和。
例如,我们交换字节组中两字节的顺序,得到
【B,A】+【D,C】+···+【Z,Y】
所得到的得结构与[1]式是相同的(当然结果也是要进行一次反转的)。为什么会这样呢?
我们发现两种顺序获得的进位是相同的,都是从第 15 位到第 0 位进位以及从第 7 位到第 8
位进位。这也就是说,交换字节位置只是改变高低位字节的排列顺序,但并没有改变它们
的内在联系。
因此,无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出
来。例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网
络序(低位字节在前高位字节在后)存放在内存中。每一个 16 位的字中的字节在传送过
程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原
本以网络序存储的数据帧中的校验和项保持一致了。
(2) 并进行计算
沈阳理工大学
沈阳理工大学课程设计专用纸
No3
某些机器的字处理长度是 16 位的倍数,这样可以提高它的计算速度。由于加法所具有
的结合性,我们没有必要按照顺序对每个字节进行累加。相反,我们可以利用这一特点对
它们进行并行累加。
并行地计算校验和只是增加了每次累加的信息长度。例如,在一个 32 位的机器上,我
们可以一次增加 4 个字节,即[A,B,C,D]+···。计算结束后再把累加和“折叠”起来,把
一个 32 位的数值变为 16 位,这样产生的新的进位也要循环累积起来。
此外,在此仍不考虑字节顺序的问题,我们可以用‘[D,C,B,A]+’···或[B,A,D,C]+···
这样的顺序来计算校验和,最终再通过交换 16 位校验和中的字节序来得到正确的值。这
些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入
一个校验和字节。
3·示例
下面将通过一个简单的例子来演示通过上述的几种方法所得到的校验和的情况。
16位
字节 0/1:
字节 2/3:
字节 4/5:
字节 6/7:
合计 1:
进位:
合计 2:
最终结果:
32位
字节 0/1/2/3:
字节 4/5/6/7:
合计 1:
进位:
前半段:
后半段:
合计 2:
按字节累加
“正常”顺序
交换顺序
00 01
f2 03
f4 f5
f6 f7
2dc 1f0
dc f0
1 2
dd f2
dd f2
0001
F203
f4f5
f6f7
2ddf0
ddf0
2
ddf2
ddf2
按字节累加
“正常”顺序
0001f203
f4f5f6f7
0f4f7e8fa
0
f4f7
e8fa
1ddf1
ddf1
010003f2
f5f4f7f6
0f6f4fbe8
0
f6f4
fbe8
1f2dc
f2dc
0100
03f2
f5f4
f7f6
1f2dc
f2dc
1
f2dd
dd f2
交换顺序
03f20100
f7 f6 f5f4
0fbe8f6f4
0
fbe8
f6f4
1f2dc
f2dc
沈阳理工大学
沈阳理工大学课程设计专用纸
No4
进位:
合计 3:
最终结果:
1
ddf2
ddf2
1
f2dd
ddf2
1
f2dd
ddf2
还有一个例子是把计算工作分为两组,第二组是以奇数边界起始的。
按字节累加
“正常”顺序
00 01
f2 (00)
f2 01
03 f4
f5 f6
f7 (00)
字节 0/1:
字节 2/:
合计:
字节 4/5:
字节 6/7:
字节 8/:
合计 2:
合计 2:
进位:
合计 3:
合计 1:
合计 3(交换字节序):
合计 4
合计 4
进位:
合计 5:
0001
f200
f201
03f4
f5f6
f700
1f0ea
f0ea
1
f0eb
f201
ebf0
1ddf1
ddf1
1
ddf2
4 一些编码技术可以提高校验和的计算速度
(1) 延迟进位法
这种方法在主要的累加循环结束之后再把进位累加进和值。其实现方式就是用
32 位的累加器获得 16 位校验和,这样溢出就产生在高 16 位上。这种方法避免
了累加器中进位传感器机构的设置,但是它要求的容量是原来的累加器容量的两
倍,因此它更多地依这种方法在主要的累加循环结束之后再把进位累加进和值。
(2) 反向循环法
这种方法可以减少由循环而产生的负荷,有效地展开内部的累加循环,把循环过
程中的一系列加法命令复制下来。这种技术通常可以节省大量的时间,但是程序的逻辑设
计会比较复杂。
(3) 合并数据拷贝法
计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这样会
占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶颈,尤其是对于
沈阳理工大学
沈阳理工大学课程设计专用纸
No5
某些机器(如一些简单的慢速的微型机)来说,这一问题尤为严重。
为了解决这个问题,可以把数据读入的过程与校验的过程合二为一,也就是在读入数
据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。
4 课程设计的分析
校验和的计算过程主要分为三个步骤:数据文件的输入,校验和的计算和校验结果的
输出。其中,主要的是数据的输入和校验和的计算。
1 数据的输入方式
输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文
件读取数据时,都要进行字符到数据的相互转换。
1) 将读入的 ASCII 码转化为相应的整型变量。
if(ch>=’0’&&<=’9’)
ch-=’0’;
else
if(ch>=’a’&&ch<=’f’)
ch=ch-‘a’+10;
else
if(ch>=’A’&&ch<=’F’)
ch=ch-‘A’+10;
2) 在使用 C++编程时直接使用 16 进制的方式打开输入文件。
Ifstream in(argv[1],ios::nocreate);
i.setf(ios::hex);
2·校验和的计算
校验和算法是本程序的核心部分,最为普遍的时段循环进位法。
端循环进位的算法如下:将数据按一定数位进行累加,最高位的进位则循环加入最低
位。带校验的数据按 16 位为一个单位相加,采用端循环进位,最后对所得 16 位的数据取
沈阳理工大学