武汉理工大学计算机网络课程设计模拟Ethernet帧的发送过程中国好学长系列之小灰灰的爸爸文档格式.docx
《武汉理工大学计算机网络课程设计模拟Ethernet帧的发送过程中国好学长系列之小灰灰的爸爸文档格式.docx》由会员分享,可在线阅读,更多相关《武汉理工大学计算机网络课程设计模拟Ethernet帧的发送过程中国好学长系列之小灰灰的爸爸文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
![武汉理工大学计算机网络课程设计模拟Ethernet帧的发送过程中国好学长系列之小灰灰的爸爸文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/44dc70e6-7a4d-4b45-bf68-b1bcb2aba87f/44dc70e6-7a4d-4b45-bf68-b1bcb2aba87f1.gif)
初始条件:
(1)学习相关知识
(2)C/C++/VC/VB/JAVA语言
(3)PC机一台
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
编写程序模拟Ethernet节点的数据发送流程。
具体要求:
1)用两个线程a和b来模拟Ethernet上的两台主机。
2)用一个双字类型变量Bus来模拟总线(将其初始化为“\0”,并且总线等于“\0”时表示总线空闲)。
3)两个子线程向总线发送自己的数据。
数据用该线程的线程号进行模拟,发送数据用线程号和Bus的“或”操作进行模拟(即Bus=Bus|ID,ID为该线程的线程号)。
4)每台主机需向总线上成功发送10次数据,如果其中某次数据发送失败,则该线程结束。
5)发送流程必须遵循CSMA/CD。
随即延迟算法中的冲突窗口取0.005。
在数据发送成功(即Bus==ID)后,报告“IDsendsuccess”,产生冲突(即Bus!
=ID)后报告“IDsendconllision”,发送失败(即冲突计数值为0)后报告“IDsendfailure”。
随着主机发送成功次数增加,报告其已发送成功的次数,如“主机A发送成功数=3”。
时间安排:
第一、二天:
查阅资料,学习算法
第三、四天:
编程调试
第五天:
书写报告
指导教师签名:
年月日
系主任(或责任教师)签名:
目录
1、课程设计目的和意义………………………………………………3
2、相关知识……………………………………………………………3
3、帧结构分析…………………………………………………………4
4、Ethernet帧的发送接收流程……………………………………5
4.1Ethernet帧的发送流程…………………………………………………5
4.2Ethernet帧的接收流程…………………………………………………5
5、详细设计…………………………………………………………6
5.1设计中的重点及难点……………………………………………………6
5.2核心代码…………………………………………………………………6
5.3程序流程…………………………………………………………………8
5.4完整程序…………………………………………………………………8
6、运行结果……………………………………………………………12
7、总结…………………………………………………………………13
8、参考文献……………………………………………………………13
1、课程设计目的和意义
局域网技术发展十分迅速,目前已在企业、机关、学校的信息管理与信息服务领域中得到了广泛的应用。
在早期,人们将局域网归为一种数据通信网络。
随着局域网体系结构和协议标准研究的进展、操作系统的发展以及光纤技术的引入,局域网技术得到了快速发展。
目前Ethernet是应用最广泛的局域网。
因此,学习Ethernet技术对深入掌握局域网知识是非常重要的。
帧是在数据链路层数据进行传输与交换的基本单位。
构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。
本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。
2、可行性研究
2.1技术可行性
技术可行性分析包括:
风险分析、资源分析和技术分析。
风险分析的任务是,在给定的约束条件下,判断能否设计并实现系统所需功能和性能。
资源分析的任务是,论证是否具有系统开发所需的各类人员(管理人员和各类专业技术人员)、软件、硬件资源和工作环境等。
技术分析的任务是,论证当前的科学技术是否支持系统开发的全过程。
其中最主要的是分析技术条件是否能顺利完成开发工作,硬、软件能否满足开发者的需要等。
2.2功能分析
基本功能
(1)在一台计算机上实现,用多个程序或线程来模拟多个计算机
(2)使用一个共享数据区来模拟总线
(3)模拟实现载波监听的过程
(4)模拟实现发生冲突的过程和冲突的处理机制
3、帧封装的过程
3.1帧介绍
术语“帧”来源于串行线路上的通信,表示的是点对点信道的数据链路层的协议数据单元。
Ethernet从某种程序上可以被看作是机器这间的数据链路层连接,数据链路层把网络层交下来的数据构成帧发送到链路上。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
3.2填充帧头部字段
要完成一次帧封装的过程,首先要完成的就是帧头部的装入,这一过程非常简单,只要将前导码、定界符、目的地址、源地址、长度字段的响应数值按顺序写入就可以了。
其中,长度字段的值即为要发送的数据的实际长度。
3.3填充数据字段
在填充数据字段的过程中要注意的主要问题是数据字段的长度。
802.3标准中规定了帧数据字段的最小长度为46B,最大长度为1500B。
如果数据不足46B,则需要通过填充0来补足;
如数据长度超过1500B,则将超过部分封装入下一个帧进行发送。
由于帧头部分应该包括6B目的地址、6B源地址字段、2B长度字段以及4B帧校验字段,因此帧头部分长度为18B。
前导码与帧前定界符不计入帧头部长度中。
那么,Ethernet帧的最小长度为64B,最大长度为1518B。
3.4检验字段
帧校验字段(FCS)采用32位的CRC校验。
校验的范围包括目的地址字段、
源地址字段、长度字段、LLC数据字段。
此处,为了简便起见,采用8位的CRC校验。
CRC校验的生成多项式为:
G(x)=x8+x2+x+1
某些帧结构中还会包括帧类型字段,用来识别些帖所承载的数据的类型。
当一个帧到达指定的计算机时,操作系统根据帧类型决定用哪个协议软件模块对它进行处理。
自识别帧的主要优点是,可以在同一物理网络中使用多个协议而互不干扰。
4、Ethernet帧的发送与接收流程
4.1Ethernet帧的发送流程
(1)载波侦听过程。
Ethernet中每个结点利用总线发送数据,总线是每个结点共享的公共传输介质。
所以结点在发送一个帧前,必须侦听总线是否空闲。
由于Ethernet的数据采用曼彻斯特编码方式,所以可以通过判断总线电平是否跳变来确定总线是否空闲。
若总线空闲,就可以启动发送,否则继续侦听。
(2)冲突检测。
在数据发送过程中,可能会产生冲突(冲突是指总线上同时出现两个或两个以上的发送信号,他们叠加后的信号波形与任何发送结点的输出波形都不相同)。
因为可能有多个主机都在侦听总线,当它们侦听到总线空闲时,就会往总线上发送数据。
所以在发送数据的过程中,也应该进行冲突检测,只要发现冲突就应该立即停止发送数据。
(3)随即延迟后重发。
在检测到冲突、停止发送后,结点进行随机延迟后重发。
若发16次后还没成功,则宣告发送失败,取消该帧的发送。
随机延迟的算法一般采用截断的二进制指数退避算法。
当出现线路冲突时,如果冲突的各站点都采用同样的退避间隔时间,则很容易产生二次、三次的碰撞。
因此,要求各个站点的退避间隔时间具有差异性。
这要求通过退避算法来实现。
当一个站点发现线路忙时,要等待一个延时时间M,然后再进行侦听工作。
延时时间M由以下算法决定:
M=2k*R*a。
其中a为冲突窗口值(冲突窗口为总线最大长度和电磁波在介质中传播速度比值的2倍),R为随机数,k的取值为k=min(n,16),n为该帧已被发送的次数。
图1给出了Ethernet帧的发送流程。
4.2Ethernet帧的接收流程
帧的接收流程大致可以分为以下三个步骤:
1)检查是否发生冲突,若发生冲突,则丢弃该帧;
若没有冲突,进入下一步。
2)检查该帧的目的地址看是否可以接收该帧,若可以接收,则进入下一步。
3)检查CRC检验和LLC数据长度。
若都正确,接受该帧,否则丢弃。
N
图1Ethernet帧的发送流程
5、详细设计
5.1设计中的重点及难点
1)模拟冲突过程,在这个程序中不要使用任何线程同步机制。
2)若程序中不能模拟出冲突,可以在某些地方加入延时。
5.2核心代码
inti=0;
//发送成功次数
intCollisionCounter=16;
//冲突计数器初始值为16
doubleCollisionWindow=0.005;
//冲突窗口值取值0.005
intrandNum=rand()%3;
//随机数
loop:
if(Bus==0)//总线空闲
{
Bus=Bus|ID1;
//模拟发送包
Sleep(12);
if(Bus==ID1)//无冲突
{
printf("
%dSendSuccess\n\n"
ID1);
//发送成功
Bus=0;
//内存清零
CollisionCounter=16;
//复原冲突计数器
Sleep(rand()%10);
//随即延时
i++;
主机a发送成功次数=%d\n\n"
i);
if(i<
10)
gotoloop;
//发送次数不够10次,开始下一次发送
}
else
{
%dSendCollision\n\n"
//发生冲突
CollisionCounter--;
Bus=0;
if(CollisionCounter>
0)
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>
10)?
10:
CollisionCounter)*CollisionWindow);
//下一次尝试发送
}
else
%dSendFailure\n\n"
ID1);
}
else//总线忙
//继续载波侦听
return0;
}
5.3程序流程
结束
图2主程序流程图
5.4完整程序
#include"
cmath"
afxwin.h"
#include<
iostream>
conio.h>
CWinThread*thread1,*thread2;
//定义2个线程对象,分别代表a,b
DWORDID1,ID2,Bus=0;
//2线程ID,总线标志
UINTaThread(LPVOIDpParam);
//线程a,代表主机a
UINTbThread(LPVOIDpParam);
//线程b,代表主机b
usingnamespacestd;
intmain(intargc,char*argv[],char*envp[])
intnRetCode=0;
thread1=:
:
AfxBeginThread(aThread,NULL);
//启动线程a
ID1=thread1->
m_nThreadID;
thread2=:
AfxBeginThread(bThread,NULL);
//启动线程b
ID2=thread2->
getch();
//主线程等待,按任意键退出程序
returnnRetCode;
UINTaThread(LPVOIDpParam)
inti=0;
intCollisionCounter=2;
doubleCollisionWindow=0.000001;
while
(1)
if(Bus==0)//总线空闲
Bus=Bus|ID1;
Sleep(12);
{
CollisionCounter=2;
printf("
if(i>
=10)
break;
//发送次数不够10次,开始下一次发送
}
else
CollisionCounter--;
//冲突次数加1
//冲突加强停止发送数据等待下面延时
if(CollisionCounter>
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>
continue;
}
return0;
UINTbThread(LPVOIDpParam)
{
Bus=Bus|ID2;
if(Bus==ID2)//无冲突
{Sleep(rand()%10);
ID2);
主机b发送成功次数=%d\n\n"
//发送次数不够10次,开始下一次发送
else
{printf("
注意:
编译时需设置工程属性(菜单中工程--》设置--》使用MFC作为静态链接库)
6、运行结果
7、总结
经过一个星期对计算机网络课程设计的学习和上机实际操作,我熟悉了模拟Ethernet帧的发送过程及数据发送流程;
更好的理解了冲突产生、发送失败原因及如何解决此类问题,学到了在课本上没有学到的知识与道理。
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在,因此作为二十一世纪的大学生来说掌握计算机开发技术是十分重要的。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,提高自己的实际动手能力和独立思考的能力。
在该设计过程中我遇到了许多的问题,让我发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
8、参考文献
【1】《计算机网络课程设计》胡晓英等机械工业出版社
【2】《计算机网络与Internet教程》郭国强等清华大学出版社
【3】《计算机网络》谢希仁电子工业出版社
【4】《C程序设计》谭浩强清华大学出版社