计算机网络课程设计模拟Ethernet帧的发送过程.docx
《计算机网络课程设计模拟Ethernet帧的发送过程.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计模拟Ethernet帧的发送过程.docx(15页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计模拟Ethernet帧的发送过程
题目二:
模拟Ethernet帧的发送过程
初始条件:
(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.课程设计概述
局域网技术的发展非常迅速,在企业、机关、学校的信息管理与服务领域得到广泛的应用。
在早期,人们将局域网归为一种数据通信网络。
随着局域网体系结构和协议标准研究的进展、操作系统的发展以及光纤技术的引入,局域网技术得到了快速发展。
目前,应用最广泛的局域网是总线型局域网,即以太网(Ethernet)。
总线型局域网的核心技术是随机争用型介质访问控制方法,即带有冲突检测的载波侦听多路访问(CSMA/CD,CarrierSenseMultipleAccesswithCollisionDetection)方法。
CSMA/CD方法用来解决多个结点共享公用总线的问题。
在Ethernet中,任何结点都没有可预约的发送时间,这种介质访问控制属于随机争用型方法。
学习Ethernet技术对深入掌握局域网知识是非常重要的。
本课程设计的目的是模拟Ethernet帧的发送过程,熟悉Ethernet帧的数据发送流程,即CSMA/CD工作流程。
2.以太网的CSMA/CD协议
以太网总线上只要有一台计算机在发生数据,总线传输资源就被占用,因此,在同一时间只能允许一台计算机在发生数据。
Ethernet的核心技术是随机争用型介质访问方法,即带有冲突检测的载波侦听多路访问(CSMA/CD)方法。
2.1Ethernet帧的发送流程
1)载波侦听过程。
Ethernet中每个结点利用总线发送数据,总线是每个结点共享的公共传输介质。
所以结点在发送一个帧前,必须侦听总线是否空闲。
由于Ethernet的数据采用曼彻斯特编码方式,所以可以通过判断总线电平是否跳变来确定总线是否空闲。
若总线空闲,就可以启动发送,否则继续侦听。
2)冲突检测。
在数据发送过程中,可能会产生冲突(冲突是指总线上同时出现两个或两个以上的发送信号,他们叠加后的信号波形与任何发送结点的输出波形都不相同)。
因为可能有多个主机都在侦听总线,当它们侦听到总线空闲时,就会往总线上发送数据。
所以在发送数据的过程中,也应该进行冲突检测,只要发现冲突就应该立即停止发送数据。
发生碰撞
3)随即延迟后重发。
在检测到冲突、停止发送后,结点进行随机延迟后重发。
若发16次后还没成功,则宣告发送失败,取消该帧的发送。
随机延迟的算法一般采用截断二进制指数退避算法。
2.2Ethernet帧的接收流程
帧的接收流程大致可以分为以下三个步骤:
1)检查是否发生冲突,若发生冲突,则丢弃该帧;若没有冲突,进入下一步。
2)检查该帧的目的地址看是否可以接收该帧,若可以接收,则进入下一步。
3)检查CRC检验和LLC数据长度。
若都正确,接受该帧,否则丢弃。
2.3截断二进制指数退避算法
当出现线路冲突时,如果冲突的各站点都采用同样的退避间隔时间,则很容易产生二次、三次的碰撞。
因此,要求各个站点的退避间隔时间具有差异性。
这要求通过退避算法来实现。
该算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即发生数据,而是推迟(即退避)一个随机的时间T,才开始监听总线,等总线空闲再重传。
令k=Min【重传次数,10】,然后从整数集合{0,1,……,2^k-1}中随机取出一个数,记为R,则重传等待时间T=R*A,A为冲突窗口值(冲突窗口为总线最大长度和电磁波在介质中传播速度比值的2倍),也叫争用期,因此T为R倍的争用期。
这样做的好处是当连续发生多次冲突,就表明可能有较多的站参与争用信道,使用该算法可以使推迟的平均时间随重传次数增大而增大(动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定。
2.4Ethernet帧的发送流程图
3系统平台、语言和工具
系统:
Windows
语言:
C++
工具:
VC6.0
4.设计思想
从主程序启动2个线程(A和B)来模拟两台主机发送数据(线程本身的ID号)。
使用一个线程计数器Count=0,启动一个线程时加1,某个线程退出时减1,主线程启动2个线程后循环等待,直到Count==0时(即2个线程都退出)主线程结束,退出程序。
主线程流程图:
N
Y
2个线程函数ThreadFunc_A()和ThreadFunc_B()的函数体很相似,2个线程同时循环监听总线Bus,Bus=0时开始发送数据,若经过一个争用期(0.005s)未发现冲突,则表明发送数据成功,若检测到冲突,则停止发送,随机退避一个时间重新监听总线并发送数据(截断二进制指数退避算法)。
相关代码:
Sleep(rand()%(int)pow(2,m)*CMPED)。
若16次都发送不成功,则报告发送失败并中止线程,线程计数器减1。
若10次数据发送成功,则线程正常结束,线程计数器减1。
5.完整代码
#include
#include
#include
#include
#defineCMPED5//争用期
DWORDThreadID_A,ThreadID_B;//线程ID,线程向总线发送的数据
HANDLEhThreadID_A,hThreadID_B;
DWORDCount=2;//线程计数器
DWORDBus=0;//总线
//线程A
DWORDWINAPIThreadFunc_A()
{
inti=1;
DWORDt1,t2,k,m;
while(i<=10)
{
k=0;//重传次数
do
{
while(Bus);
Bus=Bus|ThreadID_A;
t1=GetTickCount();
while((t2=GetTickCount())-t1<=CMPED)
{
if(Bus!
=ThreadID_A)
{
SuspendThread(hThreadID_B);
cout<<"IDsendcollision!
"<ResumeThread(hThreadID_B);
break;
}
}
if(t2-t1>CMPED)
{
cout<<"IDsendsuccess主机A发送成功次数="<
Bus=0;
break;
}
else
{
Bus=0;
k++;
if(k==16)
{
SuspendThread(hThreadID_B);
cout<<"IDsendfailure!
主机A停止发送数据。
"<ResumeThread(hThreadID_B);
Count--;
ExitThread(0);
}
m=k>10?
10:
k;
//截断二进制指数退避算法
Sleep(rand()%(int)pow(2,m)*CMPED);
}
}while
(1);
i++;
}
Count--;
return0;
}
//线程B
DWORDWINAPIThreadFunc_B()
{
inti=1;
DWORDt1,t2,k,m;
while(i<=10)
{
k=0;//重传次数
do
{
while(Bus);
Bus=Bus|ThreadID_B;
t1=GetTickCount();
while((t2=GetTickCount())-t1<=CMPED)
{
if(Bus!
=ThreadID_B)
{
SuspendThread(hThreadID_A);
cout<<"IDsendcollision!
"<ResumeThread(hThreadID_A);
break;
}
}
if(t2-t1>CMPED)
{
cout<<"IDsendsuccess主机B发送成功次数="<
Bus=0;
break;
}
else
{
Bus=0;
k++;
if(k==16)
{
SuspendThread(hThreadID_A);
cout<<"IDsendfailure!
主机B停止发送数据。
"<ResumeThread(hThreadID_A);
Count--;
ExitThread(0);
}
m=k>10?
10:
k;
//截断二进制指数退避算法
Sleep(rand()%(int)pow(2,m)*CMPED);
}
}while
(1);
i++;
}
Count--;
return0;
}
intmain()
{
srand((unsigned)time(NULL));//初始化随机数种子
do
{
hThreadID_A=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc_A,
NULL,0,&ThreadID_A);
}while(hThreadID_A==NULL);
do
{
hThreadID_B=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc_B,
NULL,0,&ThreadID_B);
}while(hThreadID_B==NULL);
while(Count);
return0;
}
6.结果截图
运行结果1运行结果2
分析:
由于采用的是随机退避算法,因此每次运行的结果显然是不同的。
当发生冲突时,使用随机动态退避可以使推迟的平均时间随重传次数增大而增大,并由于随机数的作用使得每个站点推迟的时间不一样,因而减小发生碰撞的概率,有利于整个系统的稳定。
7.课程设计总结
经过一个星期对计算机网络课程设计的学习和上机实际操作,我熟悉了Ethernet帧的发送过程及数据发送流程。
对CSMA/CD协议理解更加透彻,明白了以太网帧的发送原理。
在网络体系结构中每一层都发挥着重要的作用,各司其职,每一层所用的协议都是以后网络学习深入研究的对象。
这次的课程设计帮我深刻理解了数据链路层中以太网帧的发送过程,为我以后的网络学习打下了基础,感觉提高了许多,受益匪浅。
在这个星期的学习实践中,有过成功的欣喜,也有出现问题的焦躁,然而当一个个问题通过看书查找,询问老师、同学,慢慢解决后,也有了从未有过的自豪与骄傲。
困难固然可怕,但冷静下来,撇开焦躁的情绪,各个击破,会出现柳暗花明那一刻。
另外,我深知任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效,实践是检验真理的标准,也是检验学习的标准,学以致用,才是真正的学到了家。
课程设计顺利的完成了,不但对专业知识有了更深的理解,更使自己认识到实践的重要性,理论、实践相结合才能达到很好的学习效果,多写代码多熟练和巩固学到的语言和编程技巧,能达到事半功倍的效果。
本科生课程设计成绩评定表
班级:
软件0901 姓名:
唐诗玮学号:
*************
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
201年 月 日
封
底