优秀课设计算校验和.doc
- 文档编号:4717141
- 上传时间:2023-05-07
- 格式:DOC
- 页数:22
- 大小:174.50KB
优秀课设计算校验和.doc
《优秀课设计算校验和.doc》由会员分享,可在线阅读,更多相关《优秀课设计算校验和.doc(22页珍藏版)》请在冰点文库上搜索。
四川理工学院
课程设计书
学院计算机学院
专业计算机科学与技术
班级零八级六班
题目SNMP的简单实现
教师鲜乾坤陈超
学生杨忠书王琼伍鲁阳琼
摘要
IP协议为提高数据传输效率,简化了协议,舍弃了许多为提供可靠性所需要的工作(如建立连接、维护连接、拆除连接、确认应答、时间片处理等)。
其唯一的正确性检验即依靠头部校验和,以保证头部数据的完整性。
为了研究IP首部校验算法,查看了相关的RFC文档并利用wireshark工具进行了抓包,并对抓包取得的数据进行了计算验证。
研究发现了一些算法存在一定的问题并对它的改进算法进行了研究。
关键字:
计算校验和并行计算字节顺序延迟进位
前言
本课程设计的主要意图是,通过计算机网络中的计算校验和来了解计算机是怎么样判断接收数据的正确与错误。
同时也让我们更进一步的了解计算机的一般思想,从而了解计算校验和的目的与作用。
最后我们要学会计算校验和,了解和扩展计算机网络的知识面。
校验和的作用就是保证数据传送的正确性。
本次课程设计的主要内容包括以下几个方面:
课程设计目的,通过这一点我们可以了解我们为什么要计算校验和,它的作用和目的是什么,从而学会计算校验和。
课程设计的要求,根据下面课程设计中的计算方法编制程序为给定数据计算检验和。
计算校验和的相关知识,如交换性与结合性,字节顺序的自主性,并行计算以及实例,以及给出一些编码技术可以提高校验和的速度。
课程设计分析,主要是从数据的输入方式,校验和的计算流程图。
对知识进行了一些扩展。
给出了自己做课程设计的心得体会,和一些参考资料。
本次课程设计的适用范围是,所有在校大学生和一些对计算机网络感兴趣的人都可以指导和参观。
课程设计分工:
杨忠书负责设计设计目的、设计要求、以及相关知识的收索。
王琼伍主要负责本课程设计的课程设计的分析、程序流程图设计、和一些相关知识的扩展。
鲁阳主要负责本课程设计的相关文献的查找、序言和目录的设定、文档排版及整个课程设计报告的整理。
审校人:
鲜乾坤、陈超
相关的说明:
本课程设计由于设计人的经验不足其中的一些内容可能有许多不完整的地方。
希望读者在阅读的时候能结合我们提供的文献一起参考。
目录
第一章概述..........................................................................................................1
1.1设计综述............................................................................................1
1.1.1设计目的...................................................................................1
1.1.2设计要求...................................................................................1
1.1.3设计原理...................................................................................2
1.2计算校验和........................................................................................3
1.2.1交换性和结合性.......................................................................3
1.2.2字节顺序的自主性...................................................................4
1.2.3并进行计算...............................................................................4
1.3示例....................................................................................................5
1.4一些编码技术可以提高校验和的计算速度....................................7
1.4.1延迟进位法...............................................................................7
1.4.2反向循环法...............................................................................7
1.4.3合并数据拷贝法.......................................................................7
第二章设计分析..................................................................................................9
2.1数据的输入方式................................................................................9
2.2校验和的计算..................................................................................10
2.3程序流程图......................................................................................11
第三章相关扩展................................................................................................12
3.1主要实现过程..................................................................................12
3.2程序流程图......................................................................................13
第四章编程实现................................................................................................14
4.1程序源代码.....................................................................................14
4.2程序运行截图..................................................................................17
设计总结..............................................................................................................18
参考文献..............................................................................................................20
第一章概述
1.1设计综述
1.1.1设计目的
将正常文件的内容,计算其校验和,将该校验和写入文件中或写入别的文件中保存。
在文件使用过程中,定期地或每次使用文件前,检查文件现在内容算出的校验和与原来保存的校验和是否一致,因而可以发现文件是否感染,这种方法叫校验和法,它既可发现已知病毒又可发现未和病毒。
这种方法既能发现已知病毒,也能发现未和病毒,但是,它不能识别病毒种类,不能报出病毒名称。
由于病毒感染并非文件内容改变的唯一的排他性原因,文件内容的改变有可能是正常程序引起的,所以校验和法常常误报警,而且此法也会影响文件的运行速度。
病毒感染的确会引起文件内容变化,但是校验和法对文件内容的变化太敏感,又不能区分正常程序引起的变动,而频繁报警。
用监视文件的校验和来检测病毒,不是最好的方法。
这种方法当遇到软件版本更新、变更口令以及修改运行参数时都会误报警。
校验和法对隐蔽性病毒无效。
隐蔽性病毒进驻内存后,会自动剥去染毒程序中的病毒代码,使校验和法受骗,对一个有毒文件算出正常校验和。
校验和法的优点是:
方法简单、能发现未知病毒、被查文件的细微变化也能发现。
其缺点是:
必须预先记录正常态的校验和、会误报警、不能识别病毒名称、不能对付隐蔽性病毒。
(2)流程图。
1.1.3设计原理
将正常文件的内容,计算其校验和,将该校验和写入文件中或写入别的文件中保存。
在文件使用过程中,定期地或每次使用文件前,检查文件现在内容算出的校验和与原来保存的校验和是否一致,因而可以发现文件是否感染,这种方法叫校验和法,它既可发现已知病毒又可发现未和病毒。
这种方法既能发现已知病毒,也能发现未和病毒,但是,它不能识别病毒种类,不能报出病毒名称。
由于病毒感染并非文件内容改变的唯一的排他性原因,文件内容的改变有可能是正常程序引起的,所以校验和法常常误报警,而且此法也会影响文件的运行速度。
病毒感染的确会引起文件内容变化,但是校验和法对文件内容的变化太敏感,又不能区分正常程序引起的变动,而频繁报警。
用监视文件的校验和来检测病毒,不是最好的方法。
这种方法当遇到软件版本更新、变更口令以及修改运行参数时都会误报警。
校验和法对隐蔽性病毒无效。
隐蔽性病毒进驻内存后,会自动剥去染毒程序中的病毒代码,使校验和法受骗,对一个有毒文件算出正常校验和。
1.2计算校验和
有很多数学方法可以用来提高校验和的计算速度,下面我们将就此展开讨论。
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]
的形式进行计算。
1.2.2字节顺序的自主性
CRC的工作原理是,CRC在发送端编码和接受端校验时,都可以利用事先约定的生成多项式G(x)来得到,K位要发送的信息位可对应于一个(K-1)次多项式K(x),r为冗余位则对应于一个(r-1)次多项式R(x),有r位冗余位组成的n=k+r位码字则对应与一个(n-1)次多项式T(x)=Xr*K(x)+R(x)。
(4)循环冗余校验码的特点
CRC校验码的检测能力很强,不仅能检查出离散错误,还能检查出突发错误。
CRC校验码具有以下检错能力:
第五章CRC检验码可检测出所有单个错误。
第六章CRC检验码可检测出所有奇数位错误。
第七章CRC检验码可检测出所有双位的错误。
第八章CRC检验码可检测出所有小于、等于校验位长度的突发错误。
位的机器上,我们可以一次增加4个字节,即[A,B,C,D]+’……。
计算结束后再把累加和“折叠”起来,把一个32位的数值变为16位,这样产生的新的进位也要循环累积起来。
此外,在此仍不考虑字节顺序的问题,我们可以用’[D,C,B,A]+’……或[B,A,D,C]+;……这样的顺序来计算校验和,最终再通过交换16位校验和中的字节序来得到正确的值。
这些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。
1.3示例
下面将通过一个简单的例子来演示通过上述的几种方法所得到的校验和的情况
16位
按字节累加
“正常”顺序
交换顺序
字节0/1:
0001
0001
0100
字节2/3:
f203
F203
03f2
字节4/5:
f4f5
f4f5
f5f4
字节6/7:
f6f7
f6f7
f7f6
------
-----
-----
合计1:
2dc1f0
2ddf0
1f2dc
dcf0
ddf0
f2dc
进位:
12
2
1
----
----
----
合计2:
ddf2
ddf2
f2dd
最终结果:
ddf2
ddf2
ddf2
32位
按字节累加
“正常”顺序
交换顺序
字节0/1/2/3:
0001f203
010003f2
03f20100
字节4/5/6/7:
f4f5f6f7
f5f4f7f6
f7f6f5f4
--------
--------
--------
合计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:
0001
0001
字节2/:
f2(00)
f200
------
-----
合计:
f201
f201
字节4/5:
03f4
03f4
字节6/7:
f5f6
f5f6
字节8/:
f7(00)
f700
------
-----
合计2:
1f0ea
合计2:
f0ea
进位:
1
-----
合计3:
f0eb
合计1:
f201
合计3(交换字节序):
ebf0
-----
合计4
1ddf1
合计4
ddf1
进位:
1
-----
合计5:
ddf2
1.4一些编码技术可以提高校验和的计算速度
源码及注释
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineERROR_SHMGET-1
#defineERROR_SHMAT-2
#defineERROR_WAIT-3
#defineERROR_FORK-4
#defineSLOT_TIME0.005
/*截止二进制指数退避算法的实现
该算法可以表示为:
t=2*τ*r为结点重新发送需要的后退延迟时间;2*τ为冲突窗口值;
r为随机数,r的取值范围为[0,2^k-1],k=Min[重传次数,10];
当重传16次仍不成功时,则丢弃该帧.
*/
staticunsignedlongget_backoff(constintn)//计算重传推迟时间
{
intk=n;
k=16-k;
if(k>10)//如果重传次数大于10时,重传次数置为10
k=10;
return(random()%(1< } /*发送数据流程*/ staticvoidsend_msg(constvoid*addr,constpid_tpid,charch) { pid_t*bus=(pid_t*)addr; intcollision;//冲突计数器 intk=0;//发送成功的次数 for(inti=0;i<10;i++) { collision=16; do { while(*bus! =0);//总线不空闲,循环等待直到总线空闲. usleep(SLOT_TIME/2);//检测到总线为空闲时就开始发送数据,因为线程A和B共享总线 变量bus,所以在τ时间以内,另一个线程收不到数据,所以要进行此操作 *bus|=pid;//表示另一个进程受收到模拟数据. usleep(SLOT_TIME/2);//从模拟数据发送后经过2τ时间之后进行判断. //判断是否冲突,共享内存与写入内存比较,若相同则无冲突,否则发生冲突. if(*bus! =pid) { *bus=0;//复原总线为0 collision--; if(collision>0) { printf("%dsendcollision.\n",pid); usleep(get_backoff(collision));//随机延时 } else { printf("%dsendfailure.\n",pid);//发送失败 break; } } else { *bus=0; break; } }while (1); if(collision>0) { k++; printf("%dsendsuccess.\n",pid); printf("%csendsuccess=%d.\n",ch,k); } usleep(random()%1024); } }/*主 函 数 */ intmain() { pid_tpid=0; intbus=0;/*共享内存的ID,用来模拟总线*/ void*addr=0;/*指向模拟总线的首地址*/ bus=shmget(IPC_PRIVATE,sizeof(pid_t),SHM_R|SHM_W);//获取共享内存 if(bus==-1)/*如果申请内存失败*/ { perror("shmgeterror."); returnERROR_SHMGET; } if((pid=fork())<0)//创建子进程a { perror("forkerror."); returnERROR_FORK; } elseif(pid==0) { pid=getpid();//获取子进程ID addr=shmat(bus,0,0);//初始化共享内存为\0 if(addr==(void*)-1) { perror("shmaterror"); /*shmctl(shmid,IPC_RMID,0)是释放共享内存区, 这只有在所有进程中的shmid都已经无效化后才会进行, 如果shmid的引用计数没有变为0,就已经调用了shmctl(shmid,IPC_RMID,0) ,则该函数什么也不做,一直等到最后一个shmdt()调用时,就执行释放共享内存的任务。 */ if(shmctl(bus,IPC_RMID,0)==-1) { perror("shmctlerror"); } returnERROR_SHMAT; } /*srandom()方法的原型如下: functionvoidsrandom(intseed); srandom()方法使用指定的种子值初始化一个对象的随机数发生器,赋随机数种子值*/ srandom((unsignedint)time(NULL)); send_msg(addr,pid,'A');//发送数据 } elseif(pid>0) { if((pid=fork())<0)//创建子进程b { perror("forkerror"); returnERROR_FORK; } elseif(pid==0) { pid=getpid();//获取子进程ID addr=shmat(bus,0,0);//初始化共享内存为\0 if(addr==(void*)-1) { perror("shmaterror."); if(shmctl(bus,IPC_RMID,0)==-1) { perror("shmctlerror."); } returnERROR_SHMAT; } srandom((unsignedint)time(NULL)); send_msg(addr,pid,'B'); } elseif(pid>0) { if(wait(NULL)==-1) { perror("waiterror."); returnERROR_WAIT; } else { return0; } } } return0; } 开始 命令行输入正确? 创建
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优秀 计算 校验