优秀完整论文-模拟Ethernet帧的发送过程_第1页
优秀完整论文-模拟Ethernet帧的发送过程_第2页
优秀完整论文-模拟Ethernet帧的发送过程_第3页
优秀完整论文-模拟Ethernet帧的发送过程_第4页
优秀完整论文-模拟Ethernet帧的发送过程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

长沙理工大学计算机网络课程设计报告xxx学 院 xxx 专 业 通信工程 班 级 通信xxxx班 学 号20108xxxxx 学生姓名 xxxx 指导教师 xxxx 课程成绩 完成日期2013年7月5日 课程设计成绩评定学 院 xxx 专 业 通信工程 班 级 通信xxx班 学 号20108525xxxx学生姓名 xxxx 指导教师 xxx 完成日期 2013 年 7月 5日 指导教师对学生在课程设计中的评价评分项目优良中及格不及格课程设计中的创造性成果学生掌握课程内容的程度课程设计完成情况课程设计动手能力文字表达学习态度规范要求课程设计论文的质量综合成绩 指导教师签字 2013年7月 10日指导教师对课程设计的评定意见课程设计任务书 xxx 学院 通信工程专业 课程名称计算机网络课程设计时间20122013学年第二学期1819周学生姓名xxx指导老师xxx题 目模拟Ethernet帧的发送过程主要内容:设计一个模拟Ethernet帧的发送过程的程序,并根据这个程序,说明模拟Ethernet帧的发送过程的结构及相关问题,从而对模拟Ethernet帧的发送过程工作原理有更好的理解和认识。要求:(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。应当提交的文件:(1)课程设计报告。(2)课程设计附件(各类图纸、设备配置清单、报告等) 模拟Ethernet帧的发送过程模拟Ethernet帧的发送过程学生姓名:xxx 指导老师:xxxx摘要: 此次课程设计是基于计算机网络帧的工作原理以及C语言的模块实现方式,编辑设计一个模拟Ethernet帧的发送过程的程序,并根据这个程序,说明模拟Ethernet帧的结构及协议的相关问题,从而对模拟Ethernet帧的发送过程的工作原理有更好的理解和认识。通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。关键字: 模拟Ethernet帧;c语言;网络协议。1 引 言帧是在数据链路层数据进行传输与交换的基本单位。构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。1.1 课程设计的目的 明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成能力拓展训练任务。设计报告:要求层次清楚,整洁,规范,不得相互抄袭1.2 课程设计的要求题目:编写程序模拟Ethernet结点的数据发送流程设计要求:(1)用两个线程a,b来模拟Ethernet上的两台主机。(2)用一个双字类型变量Bus来模拟总线(将其初始化为“/0”,并且总线等于“/0”时表示总线空闲)。(3)两个子线程向总线发送自己的数据。数据用该线程的线程信号进行模拟,发送数据用线程号和Bus的“或”操作进行模拟(即Bus=Bus|ID,ID为该线程的线程号)。(4)每台主机须向总线成功发送10次数据,如果其中某次数据发送失败,则该线程结束。(5)发送流程须遵循CSMA/CD(载波监听多路访问/冲突检测)。随机延迟算法中的冲突窗口取0.005。在数据发送成功(即Bus=ID)后,报告“ID send success”,产生冲突(即Bus!=ID)后,报告“ID send collision”,发送失败(即冲突计数器值为0)后报告“ID send failure”。随着主机发送成功次数的增加,报告其已发送成功的次数,如“主机A发送成功次数=3”。 1.3 课程设计平台 Microsoft visual C+6.0 2 设计原理2.1可行性分析1.技术可行性技术可行性分析包括:风险分析、资源分析和技术分析。风险分析的任务是,在给定的约束条件下,判断能否设计并实现系统所需功能和性能。资源分析的任务是,论证是否具有系统开发所需的各类人员(管理人员和各类专业技术人员)、软件、硬件资源和工作环境等。技术分析的任务是,论证当前的科学技术是否支持系统开发的全过程。其中最主要的是分析技术条件是否能顺利完成开发工作,硬、软件能否满足开发者的需要等。2.功能分析基本功能(1).在一台计算机上实现,用多个程序或线程来模拟多个计算机(2).使用一个共享数据区来模拟总线(3).模拟实现载波监听的过程 (4). 模拟实现发生冲突的过程和冲突的处理机制2.2帧结构分析1帧的介绍术语“帧”来源于串行线路上的通信。其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。Ethernet从某种程序上可以被看作是机器这间的数据链路层连接。首先我们来认识一下Ethernet帧结构,Ethernet V2.0规范和IEEE802.3标准中的Ethernet帧结构有一些差别,这里我们按802.3标准的帧结构进行讨论,2.1一给出了Ethernet帧结构图。前导码帧前定界符目的地址源地址长度字段数据字段校验字段(7B)(1B)(2/6B)(2/6B)(2B)(长度可变)(4B)图2.1 Ethernet帧结构如图2.1所示,802.3标准的Ethernet帧结构由6部分组成。(1)前导码与帧前定界符字段前导码由56位(7B)的1010101101010位序列组成。帧前定界符可以视为前导码的延续。1B的帧前定界符结构为10101011。如果将前导码与帧定界符一起看,那么在62位1010101010位序列之后出现11。在11之后是Ethernet帧的目的地址字段。前导码与帧前定界符主要是保证接收同步,这8B接收后不需要保留,也不记入帧头长度中。(2)目的地址和源地址目的地址(DA)与法制地址(SA)分别表示帧的接收结点地址与发送结点的硬件地址。l 在Ethernet帧中,目的地址和法制地址字段长度可以是2B或6B。目前的Ethernet都使用6B(即48位)长度的地址。l Ethernet帧的目的地址可以是单播地址(unicast address)、多播地址(multicast address)与广播地址(broadcast address),目的地址的第一位为0表示单播地址,为1表示多播地址,目的地址为全1表示广播地址。(3)长度字段8023标准中的帧用2B定义数据字段包含的字节数。协议规定,帧数据的最小长度为46B,最大长度为1500B。设置最小帧长度的目的是使每个接收结点能够有足够的时间检测到冲突。(4)数据字段帧数据字段的最小长度为46B。如果帧的LLC数据少于46B,则应将数据字段填充至46B。填充字符是任意的,不计入长度字段值中。(5)检验字段帧校验字段(FCS)采用32位的CRC校验。校验的范围包括目的地址字段、源地址字段、长度字段、LLC数据字段。此处,为了简便起见,采用8位的CRC校验。CRC校验的生成多项式为:G(x)= x8+ x2+x+1 某些帧结构中还会包括帧类型字段,用来识别些帖所承载的数据的类型。当一个帧到达指定的计算机时,操作系统根据帧类型决定用哪个协议软件模块对它进行处理。自识别帧的主要优点是,可以在同一物理网络中使用多个协议而互不干扰。3系统设计3.1 Ethernet帧的发送1 Ethernet帧的发送流程1)载波侦听过程。Ethernet中每个结点利用总线发送数据,总线是每个结点共享的公共传输介质。所以结点在发送一个帧前,必须侦听总线是否空闲。由于Ethernet的数据采用曼彻斯特编码方式,所以可以通过判断总线电平是否跳变来确定总线是否空闲。若总线空闲,就可以启动发送,否则继续侦听。2)冲突检测。在数据发送过程中,可能会产生冲突(冲突是指总线上同时出现两个或两个以上的发送信号,他们叠加后的信号波形与任何发送结点的输出波形都不相同)。因为可能有多个主机都在侦听总线,当它们侦听到总线空闲时,就会往总线上发送数据。所以在发送数据的过程中,也应该进行冲突检测,只要发现冲突就应该立即停止发送数据。3)随即延迟后重发。在检测到冲突、停止发送后,结点进行随机延迟后重发。若发16次后还没成功,则宣告发送失败,取消该帧的发送。随机延迟的算法一般采用截断的二进制指数退避算法。当出现线路冲突时,如果冲突的各站点都采用同样的退避间隔时间,则很容易产生二次、三次的碰撞。因此,要求各个站点的退避间隔时间具有差异性。这要求通过退避算法来实现。当一个站点发现线路忙时,要等待一个延时时间M,然后再进行侦听工作。延时时间M由以下算法决定:M=2k*R*a。其中a为冲突窗口值(冲突窗口为总线最大长度和电磁波在介质中传播速度比值的2倍),R为随机数,k的取值为k=min(n,16),n为该帧已被发送的次数。图3.1给出了Ethernet帧的发送流程。3.2 Ethernet帧的接收流程帧的接收流程大致可以分为以下三个步骤:1)检查是否发生冲突,若发生冲突,则丢弃该帧;若没有冲突,进入下一步。2)检查该帧的目的地址看是否可以接收该帧,若可以接收,则进入下一步。3)检查CRC检验和LLC数据长度。若都正确,接受该帧YNYY发送帧装配帧总线忙启动发送冲突?发送完成?发送成功冲突加强冲突次数加1等待后退延迟时间计算后退延迟发送失败冲突次数16?YNNN图3.1 Ethernet帧的发送流程3.3 封装过程1.设计中的重点及难点1)模拟冲突过程,在这个程序中不要使用任何线程同步机制。2)若程序中不能模拟出冲突,可以在某些地方加入延时。2.核心代码int i=0; /发送成功次数int CollisionCounter=16; /冲突计数器初始值为16double CollisionWindow=0.005; /冲突窗口值取值0.005int randNum=rand()%3; /随机数loop: if(Bus=0) /总线空闲 Bus=Bus|ID1; /模拟发送包 Sleep(12); if (Bus=ID1) /无冲突 printf(%d Send Successnn,ID1); /发送成功 Bus=0; /内存清零 CollisionCounter=16; /复原冲突计数器 Sleep(rand()%10); /随即延时 i+; printf(主机a发送成功次数=%dnn,i); if(i0) /随即延迟重发,延迟算法用截断的二进制指数退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter10)?10: CollisionCounter)*CollisionWindow); goto loop; /下一次尝试发送double CollisionWindow=0.005int randNum=rand()%3; loop: if(Bus=0)Bus=Bus|ID1 if (Bus=ID1) Sleep(12); printf(%d Send Successnn,ID1); Bus=0; CollisionCounter=16; Sleep(rand()%10); i+; printf(主机a发送成功次数=%dnn,i); if(i0) Sleep(randNum*(int)pow(2,(CollisionCounter10)?10: goto loop; CollisionCounter)*CollisionWindow); else else printf(%d Send Failurenn, ID1 ); else /总线忙 goto loop; /继续载波侦听 return 0;2 程序流程 开始启动线程A启动线程B结束图3.2 主程序流程图3.4 设计程序/注意:编译时需设置工程属性(菜单中工程设置使用MFC作为静态链接库)#include cmath /#include afxwin.h /#include /#include /CWinThread * thread1, * thread2; /定义2个线程对象,分别代表a,bDWORD ID1, ID2, Bus = 0; /2线程ID,总线标志UINT aThread(LPVOID pParam); /线程a,代表主机aUINT bThread(LPVOID pParam); /线程b,代表主机busing namespace std;int main(int argc, char* argv, char * envp)int nRetCode = 0;thread1 = :AfxBeginThread(aThread, NULL); /启动线程aID1 = thread1-m_nThreadID;thread2 = :AfxBeginThread(bThread, NULL); /启动线程bID2 = thread2-m_nThreadID;getch(); /主线程等待,按任意键退出程序return nRetCode;UINT aThread(LPVOID pParam)int i=0; /发送成功次数int CollisionCounter=2; /冲突计数器初始值为16double CollisionWindow=0.000001; /冲突窗口值取值0.005int randNum=rand()%3; /随机数while(1)if(Bus=0) /总线空闲Bus=Bus|ID1; /模拟发送包Sleep(12);if (Bus=ID1) /无冲突 printf(%d Send Successnn,ID1); /发送成功 Bus=0; /内存清零 CollisionCounter=2; /复原冲突计数器 Sleep(rand()%10); /随即延时 i+; printf(主机a发送成功次数=%dnn,i); if(i=10) break;/发送次数不够10次,开始下一次发送 elseprintf(%d Send Collisionnn,ID1); /发生冲突 CollisionCounter-; /冲突次数加1 Bus=0; /冲突加强 停止发送数据 等待下面延时if(CollisionCounter0) /随即延迟重发,延迟算法用截断的二进制指数退避算法Sleep(randNum*(int)pow(2,(CollisionCounter10)?10: CollisionCounter)*CollisionWindow); continue; /下一次尝试发送elseprintf(%d Send Failurenn,ID1); return 0;UINT bThread(LPVOID pParam)int i=0; /发送成功次数int CollisionCounter=16; /冲突计数器初始值为16double CollisionWindow=0.005; /冲突窗口值取值0.005int randNum=rand()%3; /随机数while(1)if(Bus=0) /总线空闲 Bus=Bus|ID2; /模拟发送包Sleep(12);if (Bus=ID2) /无冲突Sleep(rand()%10); printf(%d Send Successnn,ID2); /发送成功 Bus=0; /内存清零 CollisionCounter=16; /复原冲突计数器 Sleep(rand()%10); /随即延时 i+; printf(主机b发送成功次数=%dnn,i); if(i=10) break;/发送次数不够10次,开始下一次发送 elseprintf(%d Send Collisionnn,ID2); /发生冲突 CollisionCounter-; /冲突次数加1 Bus=0; /冲突加强 停止发送数据 等待下面延时if(CollisionCounter0) /随即延迟重发,延迟算法用截断的二进制指数退避算法Sleep(randNum*(int)pow(2,(CollisionCounter10)?10: CollisionCounter)*CollisionWindow); continue; /下一次尝试发送elseprintf(%d Send Failurenn,ID2);return 0;3.5 运行结果图3-3程序代码执行过程图3.4 运行后结果(1)图3.5 运行后结果(2)3.5 问题处理 源代码编辑后,编译无错误,但是连接时出现一个错误,这是要设置Microsoft visual C+6.0平台参数,在平台上选键:project/setting/c/c+中“Category”选择“code generation”;use run-time library”选择debug multithreaded,即可解决该问题4 课程设计心得与体会经过一个星期对计算机网络课程设计的学习和上机实际操作,我熟悉了模拟Ethernet帧的发送过程及数据发送流程;更好的理解了冲突产生、发送失败原因及如何解决此类问题,学到了在课本上没有学到的知识与道理。通过本次课程设计,首先认识到了自己的不足。在编码的过程中认识到了自己细节方面的不足,在以后计算机网络的学习过程中在理解的同时还要做到对细节的注重;当然在本次课设中最终还是实现了题目要求。同时,觉得本次课设是十分有意义的,使自己所学的只是有了实践的地方。课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在,因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。回顾起此次课程设计,我感慨颇多。它不仅巩固了我所学过的知识,而且让我学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,提高自己的实际动手能力和独立思考的能力。在该设计过程中我遇到了许多的问题,让我发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。 对我而言我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,提高自己的实际动手能力和独立思考的能力。在该设计过程中我遇到了许多的问题,让我发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。只有经过不断的努力才能为以后的生活工作打下良好的基础。,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。 在这里我要对谢老师以及其他给予我指导和监督的老师表示感谢。 参考文献【1】 胡晓英等;计算机网络课程设计;北京:机械工业出版社,2005.9【2】 郭国强等;计算机网络与Internet教程;北京:清华出版社,2006.11【3】 杨丰瑞 杨丰任;实用教程最新计算机网络;北京:中国铁道出版社,2001.7【4】 蒋东兴.WindowsSockets网络程序设计大全M.北京:清华大学出版社【5】 谢希仁;计算机网络;北京:电子工业出附录:源程序#include cmath /#include afxwin.h /#include /#include /CWinThread * thread1, * thread2; /定义2个线程对象,分别代表a,bDWORD ID1, ID2, Bus = 0; /2线程ID,总线标志UINT aThread(LPVOID pParam); /线程a,代表主机aUINT bThread(LPVOID pParam); /线程b,代表主机busing namespace std;int main(int argc, char* argv, char * envp)int nRetCode = 0;thread1 = :AfxBeginThread(aThread, NULL); /启动线程aID1 = thread1-m_nThreadID;thread2 = :AfxBeginThread(bThread, NULL); /启动线程bID2 = thread2-m_nThreadID;getch(); /主线程等待,按任意键退出程序return nRetCode;UINT aThread(LPVOID pParam)int i=0; /发送成功次数int CollisionCounter=2; /冲突计数器初始值为16double CollisionWindow=0.000001; /冲突窗口值取值0.005int randNum=rand()%3; /随机数while(1)if(Bus=0) /总线空闲Bus=Bus|ID1; /模拟发送包Sleep(12);if (Bus=ID1) /无冲突 printf(%d Send Successnn,ID1); /发送成功 Bus=0; /内存清零 CollisionCounter=2; /复原冲突计数器 Sleep(rand()%10); /随即延时 i+; printf(主机a发送成功次数=%dnn,i); if(i=10) break;/发送次数不够10次,开始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论