优秀完整论文-模拟Ethernet帧的发送过程 - 图文

更新时间:2024-03-20 18:08:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

长沙理工大学

《计算机网络》课程设计报告

xxx

学 院 xxx 专 业 通信工程 班 级 通信xxxx班 学 号20108xxxxx 学生姓名 xxxx 指导教师 xxxx 课程成绩 完成日期2013年7月5日

课程设计成绩评定

学 院 xxx 专 业 通信工程 班 级 通信xxx班 学 号20108525xxxx 学生姓名 xxxx 指导教师 xxx 完成日期 2013 年 7月 5日

指导教师对学生在课程设计中的评价

评分项目 课程设计中的创造性成果 学生掌握课程内容的程度 课程设计完成情况 课程设计动手能力 文字表达 学习态度 规范要求 课程设计论文的质量 优 良 中 及格 不及格 指导教师对课程设计的评定意见

综合成绩 指导教师签字 2013年7月 10日

课程设计任务书

xxx 学院 通信工程专业 课程名称 计算机网络课程设计 时间 学生姓名 xxx 题 目 主要内容: 设计一个模拟Ethernet帧的发送过程的程序,并根据这个程序,说明模拟Ethernet帧的发送过程的结构及相关问题,从而对模拟Ethernet帧的发送过程工作原理有更好的理解和认识。 2012~2013学年第二学期18~19周 指导老师 xxx 模拟Ethernet帧的发送过程 要求: (1)按要求编写课程设计报告书,能正确阐述设计结果。 (2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。 (3)学会文献检索的基本方法和综合运用文献的能力。 (4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。 应当提交的文件: (1)课程设计报告。 (2)课程设计附件(各类图纸、设备配置清单、报告等)

长沙理工大学城南学院 模拟Ethernet帧的发送过程

模拟Ethernet帧的发送过程

学生姓名:xxx 指导老师:xxxx

摘要: 此次课程设计是基于计算机网络帧的工作原理以及C语言的模块实现方式,编辑设计一个模拟Ethernet帧的发送过程的程序,并根据这个程序,说明模拟Ethernet帧的结构及协议的相关问题,从而对模拟Ethernet帧的发送过程的工作原理有更好的理解和认识。通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。

关键字: 模拟Ethernet帧;c语言;网络协议。

第 1 页 共 4 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

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”,

第 2 页 共 5 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

产生冲突(即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从某种程序上可以被看作是机器这间的数据链路层连接。

第 3 页 共 6 页

长沙理工大学城南学院 模拟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)的1010101…101010位序列组成。帧前定界符可以 视为前导码的延续。1B的帧前定界符结构为10101011。

如果将前导码与帧定界符一起看,那么在62位101010…1010位序列之后出 现11。在11之后是Ethernet帧的目的地址字段。前导码与帧前定界符主要是保证接收同步,这8B接收后不需要保留,也不记入帧头长度中。

(2)目的地址和源地址

目的地址(DA)与法制地址(SA)分别表示帧的接收结点地址与发送结点的硬件地址。

? 在Ethernet帧中,目的地址和法制地址字段长度可以是2B或6B。目前 的Ethernet都使用6B(即48位)长度的地址。

? Ethernet帧的目的地址可以是单播地址(unicast address)、多播地址 (multicast address)与广播地址(broadcast address),目的地址的第一位为0表示单播地址,为1表示多播地址,目的地址为全1表示广播地址。 (3)长度字段

802.3标准中的帧用2B定义数据字段包含的字节数。协议规定,帧数据的 最小长度为46B,最大长度为1500B。设置最小帧长度的目的是使每个接收结点能够有足够的时间检测到冲突。

(4)数据字段

帧数据字段的最小长度为46B。如果帧的LLC数据少于46B,则应将数据字 段填充至46B。填充字符是任意的,不计入长度字段值中。

第 4 页 共 7 页

长沙理工大学城南学院(5)检验字段

模拟Ethernet帧的发送过程

帧校验字段(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次后还没成功,则宣告发送失败,取消该帧的发送。随机延迟的算法一般采用截断的二进制指数退避算法。当出现线路冲突时,如果冲突的各站点都采用同样的退避间隔时间,则很容易产生二次、三次的碰撞。因此,要求各个

第 5 页 共 8 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

站点的退避间隔时间具有差异性。这要求通过退避算法来实现。当一个站点发现线路忙时,要等待一个延时时间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数据长度。若都正确,接受该帧

第 6 页 共 9 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程 发送帧 装配帧 Y 总线忙 N 启动发送 Y N N 发送完成? Y 发送成功 冲突次数加1 冲突加强 等待后退延迟时间 冲突? 冲突次数>16? Y 发送失败 N 计算后退延迟 图3.1 Ethernet帧的发送流程

3.3 封装过程

1.设计中的重点及难点

1)模拟冲突过程,在这个程序中不要使用任何线程同步机制。 2)若程序中不能模拟出冲突,可以在某些地方加入延时。

第 7 页 共 10 页

长沙理工大学城南学院2.核心代码

模拟Ethernet帧的发送过程

int i=0; //发送成功次数

int CollisionCounter=16; //冲突计数器初始值为16 double CollisionWindow=0.005; //冲突窗口值取值0.005 int randNum=rand()%3; //随机数 loop: if(Bus==0) //总线空闲 {

Bus=Bus|ID1; //模拟发送包 Sleep(12);

if (Bus==ID1) //无冲突 {

printf(\ //发送成功

Bus=0; //内存清零 CollisionCounter=16; //复原冲突计数器 Sleep(rand()); //随即延时 i++;

printf(\主机a发送成功次数=%d\\n\\n\ if(i<10)

goto loop; //发送次数不够10次,开始下一次发送 } else {

printf(\ //发生冲突 CollisionCounter-- ; Bus=0 ;

if(CollisionCounter>0)

{ //随即延迟重发,延迟算法用截断的二进制指数退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10: CollisionCounter)*CollisionWindow);

goto loop; //下一次尝试发送 double CollisionWindow=0.005 int randNum=rand()%3; loop: if(Bus==0) {

Bus=Bus|ID1

if (Bus==ID1) Sleep(12);

printf(\ {

Bus=0;

CollisionCounter=16; Sleep(rand()); i++;

printf(\主机a发送成功次数=%d\\n\\n\ if(i<10)

第 8 页 共 11 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

goto loop; } else {

printf(\ CollisionCounter-- ; Bus=0

if(CollisionCounter>0)

Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10: goto loop; CollisionCounter)*CollisionWindow);

else }

else

printf(\ ID1 ); } }

else //总线忙

goto loop; //继续载波侦听 return 0; }

2 程序流程

开始 启动线程A 启动线程B 结束

图3.2 主程序流程图

3.4 设计程序

//注意:编译时需设置工程属性(菜单中工程--》设置--》使用MFC作为静态链

第 9 页 共 12 页

长沙理工大学城南学院接库)

#include \ // #include \ // #include // #include //

模拟Ethernet帧的发送过程

CWinThread * thread1, * thread2; //定义2个线程对象,分别代表a,b

DWORD ID1, ID2, Bus = 0; //2线程ID,总线标志 UINT aThread(LPVOID pParam); //线程a,代表主机a UINT bThread(LPVOID pParam); //线程b,代表主机b using namespace std;

int main(int argc, char* argv[], char * envp[]) { }

UINT aThread(LPVOID pParam) {

int i=0; //发送成功次数 int nRetCode = 0;

thread1 = ::AfxBeginThread(aThread, NULL); //启动线程a ID1 = thread1->m_nThreadID;

thread2 = ::AfxBeginThread(bThread, NULL); //启动线程b ID2 = thread2->m_nThreadID;

getch(); //主线程等待,按任意键退出程序 return nRetCode;

int CollisionCounter=2; //冲突计数器初始值为16 double CollisionWindow=0.000001; //冲突窗口值取值0.005 int randNum=rand()%3; //随机数 while(1)

if(Bus==0) //总线空闲

第 10 页 共 13 页

长沙理工大学城南学院{

模拟Ethernet帧的发送过程

Bus=Bus|ID1; //模拟发送包 Sleep(12);

if (Bus==ID1) //无冲突 {

printf(\ //发送成功 Bus=0; //内存清零 CollisionCounter=2; //复原冲突计数器 Sleep(rand()); //随即延时 i++;

printf(\主机a发送成功次数=%d\\n\\n\

if(i>=10) break; }

//发送次数不够10次,开始下一次发送

else

{

printf(\ //发生冲突

CollisionCounter--; //冲突次数加1

Bus=0; //冲突加强 停止发送数据 等待下面延时

if(CollisionCounter>0)

{ //随即延迟重发,延迟算法用截断的二进制指数退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10:

CollisionCounter)*CollisionWindow);

continue; //下一次尝试发送

}

else }

printf(\

第 11 页 共 14 页

长沙理工大学城南学院} return 0; }

模拟Ethernet帧的发送过程

UINT bThread(LPVOID pParam) {

int i=0; //发送成功次数

int CollisionCounter=16; //冲突计数器初始值为16 double CollisionWindow=0.005; //冲突窗口值取值0.005 int randNum=rand()%3; //随机数 while(1)

if(Bus==0) //总线空闲 {

Bus=Bus|ID2; //模拟发送包 Sleep(12);

if (Bus==ID2) //无冲突 {Sleep(rand());

printf(\ //发送成功 Bus=0; //内存清零 CollisionCounter=16; //复原冲突计数器 Sleep(rand()); //随即延时 i++;

printf(\主机b发送成功次数=%d\\n\\n\

if(i>=10) break; } else {

printf(\ //发生冲突

//发送次数不够10次,开始下一次发送

CollisionCounter--; //冲突次数加1

第 12 页 共 15 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

Bus=0; //冲突加强 停止发送数据 等待下面延时

if(CollisionCounter>0)

{ //随即延迟重发,延迟算法用截断的二进制指数退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10:

CollisionCounter)*CollisionWindow);

} return 0; }

continue; //下一次尝试发送 }

} else {

printf(\

3.5 运行结果

图3-3程序代码执行过程

第 13 页 共 16 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

图3.4 运行后结果(1)

第 14 页 共 17 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

图3.5 运行后结果(2)

3.5 问题处理

源代码编辑后,编译无错误,但是连接时出现一个错误,这是要设置

Microsoft visual C++6.0平台参数,在平台上选键:project/setting/c/c++中“Category”选择“code generation”;use run-time library”选择debug multithreaded,即可解决该问题

第 15 页 共 18 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

4 课程设计心得与体会

经过一个星期对计算机网络课程设计的学习和上机实际操作,我熟悉了模拟Ethernet帧的发送过程及数据发送流程;更好的理解了冲突产生、发送失败原因及如何解决此类问题,学到了在课本上没有学到的知识与道理。通过本次课程设计,首先认识到了自己的不足。在编码的过程中认识到了自己细节方面的不足,在以后计算机网络的学习过程中在理解的同时还要做到对细节的注重;当然在本次课设中最终还是实现了题目要求。同时,觉得本次课设是十分有意义的,使自己所学的只是有了实践的地方。

课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题, 锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随 着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在, 因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。

回顾起此次课程设计,我感慨颇多。它不仅巩固了我所学过的知识,而且让我学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,提高自己的实际动手能力和独立思考的能力。在该设计过程中我遇到了许多的问题,让我发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。 对我而言我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,提高自己的实际动手能力和独立思考的能力。在该设计过程中我遇到了许多的问题,让我发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。只有经过不断的努力才能为以后的生活工作打下良好的基础。,,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。。 在这里我要对谢老师以及其他给予我指导和监督的老师表示感谢。

第 16 页 共 19 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

参考文献

【1】 胡晓英等;计算机网络课程设计;北京:机械工业出版社,2005.9 【2】 郭国强等;计算机网络与Internet教程;北京:清华出版社,2006.11 【3】 杨丰瑞 杨丰任;实用教程最新计算机网络;北京:中国铁道出版社,2001.7 【4】 蒋东兴.WindowsSockets网络程序设计大全[M].北京:清华大学出版社 【5】 谢希仁;计算机网络;北京:电子工业出

第 17 页 共 20 页

长沙理工大学城南学院附录:源程序

#include \ // #include \ // #include // #include //

模拟Ethernet帧的发送过程

CWinThread * thread1, * thread2; //定义2个线程对象,分别代表a,b

DWORD ID1, ID2, Bus = 0; //2线程ID,总线标志 UINT aThread(LPVOID pParam); //线程a,代表主机a UINT bThread(LPVOID pParam); //线程b,代表主机b using namespace std;

int main(int argc, char* argv[], char * envp[]) { }

UINT aThread(LPVOID pParam) {

int i=0; //发送成功次数 int nRetCode = 0;

thread1 = ::AfxBeginThread(aThread, NULL); //启动线程a ID1 = thread1->m_nThreadID;

thread2 = ::AfxBeginThread(bThread, NULL); //启动线程b ID2 = thread2->m_nThreadID;

getch(); //主线程等待,按任意键退出程序 return nRetCode;

int CollisionCounter=2; //冲突计数器初始值为16 double CollisionWindow=0.000001; //冲突窗口值取值0.005 int randNum=rand()%3; //随机数 while(1)

第 18 页 共 21 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

if(Bus==0) //总线空闲 {

Bus=Bus|ID1; //模拟发送包 Sleep(12);

if (Bus==ID1) //无冲突 {

printf(\ //发送成功 Bus=0; //内存清零 CollisionCounter=2; //复原冲突计数器 Sleep(rand()); //随即延时 i++;

printf(\主机a发送成功次数=%d\\n\\n\

if(i>=10) break; }

//发送次数不够10次,开始下一次发送

else

{

printf(\ //发生冲突

CollisionCounter--; //冲突次数加1

Bus=0; //冲突加强 停止发送数据 等待下面延时

if(CollisionCounter>0)

{ //随即延迟重发,延迟算法用截断的二进制指数退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10:

CollisionCounter)*CollisionWindow);

continue; //下一次尝试发送

}

else

printf(\

第 19 页 共 22 页

长沙理工大学城南学院

}

模拟Ethernet帧的发送过程

} return 0; }

UINT bThread(LPVOID pParam) {

int i=0; //发送成功次数

int CollisionCounter=16; //冲突计数器初始值为16 double CollisionWindow=0.005; //冲突窗口值取值0.005 int randNum=rand()%3; //随机数 while(1)

if(Bus==0) //总线空闲 {

Bus=Bus|ID2; //模拟发送包 Sleep(12);

if (Bus==ID2) //无冲突 {Sleep(rand());

printf(\ //发送成功 Bus=0; //内存清零 CollisionCounter=16; //复原冲突计数器 Sleep(rand()); //随即延时 i++;

printf(\主机b发送成功次数=%d\\n\\n\

if(i>=10) break; } else {

printf(\ //发生冲突

//发送次数不够10次,开始下一次发送

第 20 页 共 23 页

长沙理工大学城南学院 模拟Ethernet帧的发送过程

CollisionCounter--; //冲突次数加1 Bus=0; //冲突加强 停止发送数据 等待下面延时

if(CollisionCounter>0)

{ //随即延迟重发,延迟算法用截断的二进制指数退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10:

CollisionCounter)*CollisionWindow);

} return 0; }

continue; //下一次尝试发送 }

} else {

printf(\

第 21 页 共 24 页

长沙理工大学城南学院

模拟Ethernet帧的发送过程

第 22 页 共 25 页

本文来源:https://www.bwwdw.com/article/qeo8.html

Top