CSMACD模拟实验指导书.docx
- 文档编号:4558097
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:14
- 大小:179.14KB
CSMACD模拟实验指导书.docx
《CSMACD模拟实验指导书.docx》由会员分享,可在线阅读,更多相关《CSMACD模拟实验指导书.docx(14页珍藏版)》请在冰豆网上搜索。
CSMACD模拟实验指导书
实验一CSMA/CD协议模拟实验
一、实验目的
以太网是目前应用最广泛的局域网。
本课程设计的目的是通过模拟以太帧的发送过程,使大家能进一步理解和掌握以太网核心协议CSMA/CD。
二、实验要求
编写程序模拟以太结点的数据发送流程。
具体要求:
1)用两个线程a和b模拟两台主机。
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.CSMA/CD协议工作原理及性能分析
以太网的核心技术是随机争用型介质访问控制方法,即带有冲突检测的载波侦听多路访问CSMA/CD方法。
它的工作原理是:
发送数据前先侦听信道是否空闲,若空闲,则立即发送数据。
若信道忙碌,则等待一段时间至信道中的信息传输结束后再发送数据;若在上一段信息发送结束后,同时有两个或两个以上的节点都提出发送请求,则判定为冲突。
若侦听到冲突,则立即停止发送数据,等待一段随机时间,再重新尝试。
其原理简单总结为:
先听后发,边发边听,冲突停发,随机延迟后重发。
性能指标:
信道利用率、吞吐量、介质利用率等
CSMACD的主要影响因素:
传播时延、工作站数等。
①CSMA/CD对站点个数不是很敏感,对实际的输入负载比较敏感。
②CSMA/CD对传播时延a比较敏感。
③CSMA/CD冲突不可避免。
④CSMA/CD的介质利用率随a的上升下降较快。
⑤CSMA/CD适合通信量不大,交互频繁的场合
⑥对于CSMA/CD帧越长,吞吐量越太,要求帧具有最小长度,当有许多短消息时,带宽浪费严重。
⑦CSMA/CD在轻负载时提供最短延迟,但对重负载敏感。
2.以太帧的发送流程
1)载波侦听过程。
结点在发送一个帧前,必须侦听总线是否空闲。
由于以太的数据采用曼彻斯特编码方式,所以可以通过判断总线电平是否跳变来确定总线是否空闲。
若总线空闲,就可启动发送,否则继续侦听。
2)冲突检测。
在数据发送过程中,可能会产生冲突。
所以在发送数据的过程中,也应该进行冲突检测,只要发现冲突就应该停止发送数据。
3)随机延迟后重发。
在检测到冲突、停止发送后,结点进行随机延迟后重发。
若重发16次后还没成功,则宣告发送失败,取消该帧的发送。
随机延迟的计算方法一般采用截止二进制指数后退算法。
该算法可表示为:
T=2*R*a。
其中T为结点重新发送需要的后退延迟时间,a为冲突窗口值,R为随机数,从0到2k-1中取值,k的取值为min(n,10),n为该帧已被发送的次数,图1为以太帧的发送流程。
3.以太帧的接收流程
帧接收流程大致可以分为以下三个步骤:
1)检查是否发生冲突,若发生冲突则丢弃该帧,若没有冲突,进入下一步。
2)
检查该帧的目的地址看是否可以接收该帧,若可以接收,则进入下一步。
3)检查CRC校验和LLC数据长度。
若都正确,接收该帧,否则丢弃。
图1以太网的发送过程
四、参考仿真程序
#include"stdafx.h"
#include"csmacd.h"
#include
#include
#include
#include
#ifdef_DEBUG
#definenew1DEBUG_NEW
#undefTHIS_FILEHIS_FILE[]=_FILE_;
#endif
//staticcharT
CWinThread*thread1,*thread2;//定义变量
DWORDID1,ID2,Bus=0;//初始化共享
UINTaThread(LPVOIDpParam);//线程a,代表主机a
UINTbThread(LPVOIDpParam);//线程b,代表主机b
usingnamespacestd;
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
if(!
AfxWinInit(:
:
GetModuleHandle(NULL),NULL,:
:
GetCommandLine(),0))
{
cout<<_T("Fata1Error:
MFCinitializationfailed")< nRetCode=1; } else { thread1=AfxBeginThread(aThread,NULL);//启动线程a ID1=thread1->m_nThreadID;//获取线程ID号 thread2=AfxBeginThread(bThread,NULL);//启动线程b ID2=thread2->m_nThreadID;//获取线程ID号 getchar(); } returnnRetCode; } UINTaThread(LPVOIDpParam)//线程a(主机a) { inti=0;//发送成功次数 intCollisionCounter=0;//冲突计数器初始值为16 doubleCollisionwindow=0.05;//冲突窗口值取0.05 intrandNum=rand()%3;//随机数可用Srand函数改变随机函数的种子,改善随机性 Loop: if(Bus==0)//总线空闲 { Bus=Bus|ID1;//模拟发包 Sleep(12);//单位是毫秒 if(Bus==ID1)//无冲突,由发送方负责检测 { printf("%dSendSuccess\n\n",ID1);//发送成功 Bus=0;//内存清零 CollisionCounter=0;//复原冲如计数器 Sleep(rand()%10);// i++; printf("主机a发送成功次数=%d\n\n",i); if(i<10) gotoLoop;//发送次数不够10次,开始下一次发送 } else { printf("%dSendCollision\n\n",ID1);//发生冲突 Bus=0; CollisionCounter++;//冲突计数器减1 if(CollisionCounter<16) { Sleep(randNum*(int)pow(2.0,(CollisionCounter>10)? 10: CollisionCounter)*Collisionwindow);// gotoLoop;//下一次尝试发送 } else printf("%ldSendFailure\n\n",ID1);//重发次数超过16次,宣布发送失败 } } else//总线忙 gotoLoop;//继续载波侦听 return0; } UINTbThread(LPVOIDpParam)//线程b { intj=0;//发送成功次数 intCollisionCounter=0;//冲突计数器初始值为16 doubleCollisionWindow=0.05;//为争用期(51.2us),以时间为单位的冲突窗口 intrandNum=rand()%3;//随机数 Loop: if(Bus==0)//总线空闲 { Sleep (2);//可用随机函数模拟其他用户随机接入//④ Bus=Bus|ID2;//模拟发包 Sleep(3);//⑤ if(Bus==ID2)//无冲突 { printf("%dSendSuccess\n\n",ID2);//发送成功 Bus=0;//总线清零 CollisionCounter=0;//复原冲突计数器 Sleep(rand()%10); j++; printf("主机b发送成功次数=%d\n\n",j); if(j! =10)//不够10次开始下一次发送 gotoLoop; } else { printf("%dSendCollision\n\n",ID2); Bus=0; CollisionCounter++;//冲突计数器减1 if(CollisionCounter<16)//随机延迟重发,延迟算法用截止二进制指数后退算法 {Sleep(randNum*(int)pow(2.0,(CollisionCounter>10)? 10: CollisionCounter)*CollisionWindow); gotoLoop; } else {printf("%dSendFailure\n\n",ID2);} } } else//总线忙 gotoLoop;//继续装载波侦听 return0; } 注: 程序在VC下编制、执行。 五、仿真说明及程序分析 1.设计中的重点及难点 1)模拟冲突的过程,在这个程序中不要使用任何线程同步机制,以保证各线程执行的随机性; 2)若程序中不能模拟出冲突,可以在某些地方加入延时; 3)程序产生冲突主要取决于各线程能否交叉执行,具体又取决于CPU数、每一线程需要运行的时间等; 2.程序流程 图2为主程序流程图。 图3为主程序中的线程流程图,其中线程A和线程B的线程相同。 图2主程序流程图 图3线程流程图 六、sleep函数分析 对照第四项中参考仿真程序,按sleep使用顺序先后依次讨论: 1 Sleep(12): 线程a发送时延为12ms,改变sleep函数参数来观察不同时延对碰撞的影响,有: 时延(ms) 运行5次,每次出现冲突的次数 平均值 2 3 6 6 3 6 4.8 12 4 2 2 2 2 2.4 120 3 3 3 3 3 3 1200 2 2 2 2 2 2 理论上分析传播及发送时延越大,冲突越大,但实际运行结果不能反映。 随着时延参数数量级的增加,一次程序运行的时间也明显增加,符合实际。 但当时延达到几十秒时,显然不利于数据的高效传输。 2 Sleep(rand()%10): 确认一数据帧发送成功后随机等待一个不超过10ms的时间。 此处是模拟的帧间隙,即发送成功后等待一帧间隙继续准备发送下一帧。 考虑到CSMA/CD协议的帧间隙固定为9.6us,在改进后的程序(见附录)中此处改作Sleep(0.0096)。 3 Sleep(randNum*(int)pow(2.0,(CollisionCounter>10)? 10: CollisionCounter)*Collisionwindow): 检测到冲突、停止发送后,结点进行随机延迟后重发。 随机延迟采用截止二进制指数后退算法。 该算法可表示为: T=2*R*a。 其中T为结点重新发送需要的后退延迟时间,Collisionwindow为冲突窗口值a,randNum为随机数R,从0到2k-1中取值,k的取值为min(n,10),CollisionCounter为该帧已被发送的次数n。 4 Sleep (2): 为避免a,b线程sleep设置完全一致(此时仿真结果为a,b交替发送,无冲突),b检测到总线空闲时,延时2ms进行发送。 可用随机函数模拟其他用户随机接入,即改为: Sleep(rand()%x),减少冲突的几率。 考虑到争用期为51.2ms,随机等待的时间不能超过这一上限值。 结果汇总如下: 随机等待的时间x(ms) 0~9 0~50 冲突次数均值(次) 10 4 可见,随机接入确实有助于减少冲突的几率。 5 Sleep(3): 模拟从发包到监测到信道忙之间的时间,按照CSMA/CD协议,争用期和检测到信道忙有着充要关系,于是在改进的程序中此处与④的随机时间加起来和是一个时间51.2us。 七、协议的改进 1 增加窗口值 将0.05改为0.10,窗口值增大,冲突次数减少,所需时间也有所下降。 2 增加用户数 初始设置增加: *thread3以及UINTcThread(LPVOIDpParam);应用进程增加: UINTcThread(LPVOIDpParam)//线程c(同线程b)。 图4是运行后的结果截图。 3 改变发送策略 参考程序中的发送策略为“1坚持的CSMA”: 线路忙,继续侦听;不忙时,立即发送;能提高信道利用率,但带来更大可能的冲突。 改进后的程序采用“p坚持的CSMA”: 线路忙,继续侦听;不忙时,根据p概率进行发送。 多次运行发现,冲突的平均次数明显下降。 4 改变侦听策略 参考程序中线路忙,继续侦听;改进后的程序采用线路忙,等待一段时间,再侦听的侦听策略。 图4增加一个线程后运行结果 八、心得体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CSMACD 模拟 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)