计算机网络课程设计模拟Ethernet帧的发送过程讲解.docx
- 文档编号:8419883
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:79.01KB
计算机网络课程设计模拟Ethernet帧的发送过程讲解.docx
《计算机网络课程设计模拟Ethernet帧的发送过程讲解.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计模拟Ethernet帧的发送过程讲解.docx(12页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计模拟Ethernet帧的发送过程讲解
芙蓉学院
计算机网络课程设计报告
课题:
模拟Ethernet帧的发送过程
姓名:
刘珊岑
学号:
12170106
专业班级:
计算机科学与技术1201
指导教师:
聂方彦
设计时间:
2015年上学期
地点:
E3-A501
评阅意见:
评定成绩:
指导老师签名:
年月日
一、课程设计目的和意义
帧是在数据链路层数据进行传输与交换的基本单位。
构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。
本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。
二、课程设计题目描述和要求
题目:
编写程序模拟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)后,报告“IDsendcollision”,发送失败(即冲突计数器值为0)后报告“IDsendfailure”。
随着主机发送成功次数的增加,报告其已发送成功的次数,如“主机A发送成功次数=3”。
三、可行性分析
1.技术可行性
技术可行性分析包括:
风险分析、资源分析和技术分析。
风险分析的任务是,在给定的约束条件下,判断能否设计并实现系统所需功能和性能。
资源分析的任务是,论证是否具有系统开发所需的各类人员(管理人员和各类专业技术人员)、软件、硬件资源和工作环境等。
技术分析的任务是,论证当前的科学技术是否支持系统开发的全过程。
其中最主要的是分析技术条件是否能顺利完成开发工作,硬、软件能否满足开发者的需要等。
2.功能分析
基本功能
1.在一台计算机上实现,用多个程序或线程来模拟多个计算机
2.使用一个共享数据区来模拟总线
3.模拟实现载波监听的过程
4.模拟实现发生冲突的过程和冲突的处理机制
四、帧结构分析
帧的介绍
术语“帧”来源于串行线路上的通信。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
Ethernet从某种程序上可以被看作是机器这间的数据链路层连接。
首先我们来认识一下Ethernet帧结构,EthernetV2.0规范和IEEE802.3标准中的Ethernet帧结构有一些差别,这里我们按802.3标准的帧结构进行讨论,图一给出了Ethernet帧结构图。
前导码
帧前定界符
目的地址
源地址
长度字段
数据字段
校验字段
(7B)
(1B)
(2/6B)
(2/6B)
(2B)
(长度可变)
(4B)
图一Ethernet帧结构
如图一所示,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帧的目的地址可以是单播地址(unicastaddress)、多播地址
(multicastaddress)与广播地址(broadcastaddress),目的地址的第一位为0表示单播地址,为1表示多播地址,目的地址为全1表示广播地址。
(3)长度字段
802.3标准中的帧用2B定义数据字段包含的字节数。
协议规定,帧数据的
最小长度为46B,最大长度为1500B。
设置最小帧长度的目的是使每个接收结点能够有足够的时间检测到冲突。
(4)数据字段
帧数据字段的最小长度为46B。
如果帧的LLC数据少于46B,则应将数据字
段填充至46B。
填充字符是任意的,不计入长度字段值中。
(5)检验字段
帧校验字段(FCS)采用32位的CRC校验。
校验的范围包括目的地址字段、
源地址字段、长度字段、LLC数据字段。
此处,为了简便起见,采用8位的CRC校验。
CRC校验的生成多项式为:
G(x)=x8+x2+x+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为该帧已被发送的次数。
图1给出了Ethernet帧的发送流程。
2.Ethernet帧的接收流程
帧的接收流程大致可以分为以下三个步骤:
1)检查是否发生冲突,若发生冲突,则丢弃该帧;若没有冲突,进入下一步。
2)检查该帧的目的地址看是否可以接收该帧,若可以接收,则进入下一步。
3)检查CRC检验和LLC数据长度。
若都正确,接受该帧,否则丢弃。
Y
N
Y
Y
发送帧
装配帧
总线忙
启动发送
冲突?
发送完成?
发送成功
冲突加强
冲突次数加1
等待后退延迟时间
计算后退延迟
发送失败
冲突次数>16?
Y
N
N
N
图1Ethernet帧的发送流程
六.详细设计
1.设计中的重点及难点
1)模拟冲突过程,在这个程序中不要使用任何线程同步机制。
2)若程序中不能模拟出冲突,可以在某些地方加入延时。
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++;
printf("主机a发送成功次数=%d\n\n",i);
if(i<10)
gotoloop;//发送次数不够10次,开始下一次发送
}
else
{
printf("%dSendCollision\n\n",ID1);//发生冲突
CollisionCounter--;
Bus=0;
if(CollisionCounter>0)
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>10)?
10:
CollisionCounter)*CollisionWindow);
gotoloop;//下一次尝试发送
}
else
printf("%dSendFailure\n\n",ID1);
}
}
else//总线忙
gotoloop;//继续载波侦听
return0;
}
3.程序流程
图2主程序流程图
开始
启动线程A
启动线程B
结束
4.完整程序
//注意:
编译时需设置工程属性(菜单中工程--》设置--》使用MFC作为静态链接库)
#include"cmath"//
#include"afxwin.h"//
#include
#include
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->m_nThreadID;
getch();//主线程等待,按任意键退出程序
returnnRetCode;
}
UINTaThread(LPVOIDpParam)
{
inti=0;//发送成功次数
intCollisionCounter=2;//冲突计数器初始值为16
doubleCollisionWindow=0.000001;//冲突窗口值取值0.005
intrandNum=rand()%3;//随机数
while
(1)
if(Bus==0)//总线空闲
{
Bus=Bus|ID1;//模拟发送包
Sleep(12);
if(Bus==ID1)//无冲突
{
printf("%dSendSuccess\n\n",ID1);//发送成功
Bus=0;//内存清零
CollisionCounter=2;//复原冲突计数器
Sleep(rand()%10);//随即延时
i++;
printf("主机a发送成功次数=%d\n\n",i);
if(i>=10)
break;//发送次数不够10次,开始下一次发送
}
else
{
printf("%dSendCollision\n\n",ID1);//发生冲突
CollisionCounter--;//冲突次数加1
Bus=0;//冲突加强停止发送数据等待下面延时
if(CollisionCounter>0)
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>10)?
10:
CollisionCounter)*CollisionWindow);
continue;//下一次尝试发送
}
else
printf("%dSendFailure\n\n",ID1);
}
}
return0;
}
UINTbThread(LPVOIDpParam)
{
inti=0;//发送成功次数
intCollisionCounter=16;//冲突计数器初始值为16
doubleCollisionWindow=0.005;//冲突窗口值取值0.005
intrandNum=rand()%3;//随机数
while
(1)
if(Bus==0)//总线空闲
{
Bus=Bus|ID2;//模拟发送包
Sleep(12);
if(Bus==ID2)//无冲突
{Sleep(rand()%10);
printf("%dSendSuccess\n\n",ID2);//发送成功
Bus=0;//内存清零
CollisionCounter=16;//复原冲突计数器
Sleep(rand()%10);//随即延时
i++;
printf("主机b发送成功次数=%d\n\n",i);
if(i>=10)
break;//发送次数不够10次,开始下一次发送
}
else
{
printf("%dSendCollision\n\n",ID2);//发生冲突
CollisionCounter--;//冲突次数加1
Bus=0;//冲突加强停止发送数据等待下面延时
if(CollisionCounter>0)
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>10)?
10:
CollisionCounter)*CollisionWindow);
continue;//下一次尝试发送}
else
{printf("%dSendFailure\n\n",ID2);}}}
return0;
}
七.运行结果
八.总结
经过一个星期对计算机网络课程设计的学习和上机实际操作,通过查找资料熟悉了模拟Ethernet帧的发送过程及数据发送流程;在这个过程中也遇到了困难,在老师和同学的帮助下更好的理解了冲突产生、发送失败原因及如何解决此类问题,学到了在课本上没有学到的知识与道理。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,只有经过不断的努力才能为以后的生活工作打下良好的基础,今后我一定会继续努力,掌握更多的知识。
九.参考文献
【1】胡晓英等;计算机网络课程设计;北京:
机械工业出版社,2005.9
【2】郭国强等;计算机网络与Internet教程;北京:
清华出版社,2006.11
【3】杨丰瑞杨丰任;实用教程最新计算机网络;北京:
中国铁道出版社,2001.7
【4】蒋东兴.WindowsSockets网络程序设计大全[M].北京:
清华大学出版社
【5】谢希仁;计算机网络;北京:
电子工业出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 模拟 Ethernet 发送 过程 讲解
![提示](https://static.bdocx.com/images/bang_tan.gif)