计算机网络课设 计算校验和
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书
目录
摘要
1 课程设计目的 (1)
2 课程设计要求 (1)
3 相关知识 (5)
4 课程设计分析 .................................. 错误!未定义书签。1
5 程序代码........................................... 错误!未定义书签。2
6 运行结果与分析 (123)
7 实验体会 (13)
8 参考文献 (133)
网络上的数据最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据的正确性,在物理层的基础上设计了数据链路,以向网络层提高质量的服务。
目前,进行差错检测和控制的主要方法是发送方在需要发送的数据后面增加一定的冗余信息,这些冗余信息通常是通过对发送的数据进行某种算法计算而得到的。接收方对接收数据进行同样的计算,然后与数据后面附加的冗余信息进行比较,如果比较结果不同就说明在传输中出现了差错,并要求发送方重新传送该数据,以此达到确保数据准确性的目的。
在普通使用的网络协议(例如IP,ICMP,IGMP,UDP与TCP等)中,通常都设置了校验和字段以保存这些冗余信息。计算这些校验和的算法称为网络校验和算法,就是将被校验的数据按16位进行累加,然后取反码,如果数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。关于计算校验和算法的详细信息请参考RFC1071。
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] [4]
所得到的得结构与[1]式是相同的(当然结果也是要进行一次反转的)。为什么会是这样呢?我们发现两种顺序获得的进位是相同的,都是从第15位到第0位进位以及从第7位到第8位进位。这也就是说,交换字节位置只
是改变高低位字节的排列顺序,但并没有改变它们的内在联系。
因此,无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出来。例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网络序(低位字节在前高位字节在后)存放在内存中。每一个16位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原本以网络序存储的数据帧中的校验和项保持一致了。
(3)并进行计算
某些机器的字处理长度是16位的倍数,这样可以提高它的计算速度。由于加法所具有的结合性,我们没有必要按照顺序对每个字节进行累加。相反,我们可以利用这一特点对它们进行并行累加。
并行地计算校验和只是增加了每次累加的信息长度。例如,在一个323
位的机器上,我们可以一次增加4个字节,即[A,B,C,D]+’……。计算结束后再把累加和“折叠”起来,把一个32位的数值变为16位,这样产生的新的进位也要循环累积起来。
此外,在此仍不考虑字节顺序的问题,我们可以用’[D,C,B,A]+’……或[B,A,D,C]+;……这样的顺序来计算校验和,最终再通过交换16位校验和中的字节序来得到正确的值。这些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。
3.3 示例
下面将通过一个简单的例子来演示通过上述的几种方法所得到的校验和的情况
16位
按字节累加“正常”顺序交换顺序字节0/1:00 01 0001 0100
字节2/3:f2 03 F203 03f2
字节4/5:f4 f5 f4f5 f5f4
字节6/7:f6 f7 f6f7 f7f6
--- --- ----- -----
合计1:2dc 1f0 2ddf0 1f2dc
dc f0 ddf0 f2dc
进位: 1 2 2 1
-- -- ---- ----
合计2:dd f2 ddf2 f2dd
最终结果:dd f2 ddf2 dd f2
32位
按字节累加“正常”顺序交换顺序字节0/1/2/3:0001f203 010003f2 03f20100 字节4/5/6/7:f4f5f6f7 f5f4f7f6 f7 f6 f5f4
-------- -------- -------- 合计1:0f4f7e8fa 0f6f4fbe8 0fbe8f6f4 进位:0 0 0
前半段:f4f7 f6f4 fbe8
后半段:e8fa fbe8 f6f4
----- ----- ----- 合计2:1ddf1 1f2dc 1f2dc
ddf1 f2dc f2dc 进位: 1 1 1
---- ---- ---- 合计3:ddf2 f2dd f2dd 最终结果:ddf2 ddf2 ddf2
还有一个例子是把计算工作分为两组,第二组是以奇数边界起始的。
按字节累加“正常”顺序字节0/1:00 01 0001
字节2/:f2 (00) f200
--- --- ----- 合计:f2 01 f201
字节4/5:03 f4 03f4
字节6/7:f5 f6 f5f6
字节8/:f7 (00) f700
--- --- ----- 合计2:1f0ea
合计2:f0ea
进位: 1
----- 合计3:f0eb
合计1:f201