CSMACD模拟实验指导书Word文档下载推荐.docx

上传人:b****6 文档编号:17493042 上传时间:2022-12-06 格式:DOCX 页数:14 大小:179.14KB
下载 相关 举报
CSMACD模拟实验指导书Word文档下载推荐.docx_第1页
第1页 / 共14页
CSMACD模拟实验指导书Word文档下载推荐.docx_第2页
第2页 / 共14页
CSMACD模拟实验指导书Word文档下载推荐.docx_第3页
第3页 / 共14页
CSMACD模拟实验指导书Word文档下载推荐.docx_第4页
第4页 / 共14页
CSMACD模拟实验指导书Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

CSMACD模拟实验指导书Word文档下载推荐.docx

《CSMACD模拟实验指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《CSMACD模拟实验指导书Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

CSMACD模拟实验指导书Word文档下载推荐.docx

先听后发,边发边听,冲突停发,随机延迟后重发。

  性能指标:

信道利用率、吞吐量、介质利用率等

  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"

csmacd.h"

#include<

cstdio>

iostream>

cmath>

windows.h>

#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"

)<

endl;

nRetCode=1;

}

else

thread1=AfxBeginThread(aThread,NULL);

//启动线程a

ID1=thread1->

m_nThreadID;

//获取线程ID号

thread2=AfxBeginThread(bThread,NULL);

//启动线程b

ID2=thread2->

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++;

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

i);

if(i<

10)

gotoLoop;

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

%dSendCollision\n\n"

//发生冲突

CollisionCounter++;

//冲突计数器减1

if(CollisionCounter<

16)

Sleep(randNum*(int)pow(2.0,(CollisionCounter>

10)?

10:

CollisionCounter)*Collisionwindow);

//ƒ

//下一次尝试发送

%ldSendFailure\n\n"

//重发次数超过16次,宣布发送失败

else//总线忙

//继续载波侦听

return0;

UINTbThread(LPVOIDpParam)//线程b

intj=0;

//冲突计数器初始值为16

doubleCollisionWindow=0.05;

//为争用期(51.2us),以时间为单位的冲突窗口

//随机数

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

Sleep

(2);

//可用随机函数模拟其他用户随机接入//④

Bus=Bus|ID2;

//模拟发包

Sleep(3);

//⑤

if(Bus==ID2)//无冲突

printf("

ID2);

Bus=0;

//总线清零

CollisionCounter=0;

//复原冲突计数器

Sleep(rand()%10);

j++;

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

j);

if(j!

=10)//不够10次开始下一次发送

gotoLoop;

}

CollisionCounter++;

16)//随机延迟重发,延迟算法用截止二进制指数后退算法

{Sleep(randNum*(int)pow(2.0,(CollisionCounter>

CollisionCounter)*CollisionWindow);

gotoLoop;

{printf("

%dSendFailure\n\n"

//继续装载波侦听

注:

程序在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

4.8

12

4

2.4

120

1200

理论上分析传播及发送时延越大,冲突越大,但实际运行结果不能反映。

随着时延参数数量级的增加,一次程序运行的时间也明显增加,符合实际。

但当时延达到几十秒时,显然不利于数据的高效传输。

2 Sleep(rand()%10):

确认一数据帧发送成功后随机等待一个不超过10ms的时间。

此处是模拟的帧间隙,即发送成功后等待一帧间隙继续准备发送下一帧。

考虑到CSMA/CD协议的帧间隙固定为9.6us,在改进后的程序(见附录)中此处改作Sleep(0.0096)。

3 Sleep(randNum*(int)pow(2.0,(CollisionCounter>

CollisionCounter)*Collisionwindow):

检测到冲突、停止发送后,结点进行随机延迟后重发。

随机延迟采用截止二进制指数后退算法。

其中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

可见,随机接入确实有助于减少冲突的几率。

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增加一个线程后运行结果

八、心得体会

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1