计算机网络实验报告.docx
《计算机网络实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
计算机网络实验报告
学生姓名
学号
专业班级
指导教师
学院信息科学与工程学院
完成时间2014年5月
实验一分槽ALOHA协议仿真实验
用于在多路访问信道上确定下一个使用者的协议属于数据链路层的一个子层,称为介质访问控制(MediumAccessControl,MAC)子层,许多局域网都使用多路访问信道作为它的通信基础。
最简单的信道分配方案是FDM(为每个站专门分配一段频率)和TDM(为每个站分配一个时槽),当站的数量比较大而且可变,或者流量具有突发性变化的时候,就需要用到纯ALOHA协议或分槽ALOHA协议。
如果信道的状态可以被检测到,可以用到1-坚持型CSMA、非坚持CSMA和P-坚持CSMA等协议。
本实验模拟常见的几种MAC层多路访问协议,具体实验要求及内容如下。
【实验目的】
1.掌握VB、VC++、VS或JAVA等集成开发环境编写仿真程序的方法;
2.理解并掌握分槽ALOHA协议原理。
【实验内容】
编写仿真程序,对一定网络环境下MAC层的多路访问协议的分槽ALOHA协议进行实现。
通过仿真,学习协议采取的介质访问管理,包括介质分配和冲突解决机制,并对协议的性能与理论结果进行比较分析。
【编程语言和环境】
1.编程语言C/C++/C#/Java/Matlab等均可;
2.编程环境Windows(MSVisual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GCC)均可;
【实验报告】
所交实验报告内容包括:
1.实验目的与要求;
2.实验内容与实现原理;
3.实验具体设计实现及结果(含流程图及关键代码说明);
4.实验设备与实验环境;
5.实验总结
1.实验内容与原理
设置各站点初始产生包的时间点及产生包的时间间隔(均为随机值),得到所有站点成功发送1000个数据包的总时间以及这段时间内所有数据包的个数(包括各站点每次新产生的包以及由于冲突而重发的包),从而计算出每包时内尝试次数及其对应的吞吐量。
2.实验具体设计实现及结果
#include
#include
#include
usingnamespacestd;
#defineMAX_PORT_NUM5
classPort
{
public:
floatP;//站点发包概率0
intApply;//站点状态0=空闲,1=请求发送
floatPackTime;
intCountPackNum_Suc;
intCountPackNum_Col;
Port(){P=0.5;CountPackNum_Suc=0;CountPackNum_Col=0;ChangeApply(0);}
Port(floatp){P=p;CountPackNum_Suc=0;CountPackNum_Col=0;ChangeApply(0);}
voidChangeApply(floatNowTime);
};
voidPort:
:
ChangeApply(floatNowTime)
{
floatP1=(rand()%1000)/1000.0;
if(P1
elseApply=0;
PackTime=NowTime;
}
classSlottedAloha
{
public:
floatSlotTime;
floatNowTime;
intCurrent[MAX_PORT_NUM];//记录当前时槽内要发送的包,及发包站点,成为“包缓存”
intCountAllPort_suc;
intCountAllPort_all;
SlottedAloha(floatt){SlotTime=t;NowTime=0;CountAllPort_suc=0;CountAllPort_all=0;}
voidALOHA(Portprt[],intn);
};
voidSlottedAloha:
:
ALOHA(Portprt[],intn)
{
for(inti=0;;i++)//用一个死循环代表时间流逝,如果成功发送包达到1000则break
{
NowTime=SlotTime*i;
intPackLen=0;//记录时槽内要发包的总长度(个数)
for(intk=0;k{
if(prt[k].Apply==1&&prt[k].PackTime==NowTime){Current[k]=1;PackLen++;}
elseCurrent[k]=0;
}
if(PackLen==1)//只有一个包,可以发
{
for(intk=0;k{
if(Current[k]==1)//从“包缓存”中找出要发的包
{
prt[k].Apply=0;//发送成功,此站点状态变为空闲
prt[k].ChangeApply(NowTime+SlotTime*(rand()%n+1));//随机下一个发包时间
prt[k].CountPackNum_Suc++;//成功数++
}
elseif(prt[k].Apply==0)//当前不发又处于空闲的站点就测试下一个时间点是否发包
{
prt[k].ChangeApply(NowTime+SlotTime);
}
}
}
elseif(PackLen>1)//有多个包,冲突
{
for(intk=0;k{
if(Current[k]==1){prt[k].ChangeApply(NowTime+SlotTime*(rand()%n+1));prt[k].CountPackNum_Col++;}//冲突数++
elseif(prt[k].Apply==0)prt[k].ChangeApply(NowTime+SlotTime);
}
}
elseif(PackLen==0)//无包发送
{
for(intk=0;k}
CountAllPort_suc=0;CountAllPort_all=0;
for(intk=0;k{
CountAllPort_suc+=prt[k].CountPackNum_Suc;
CountAllPort_all+=prt[k].CountPackNum_Suc+prt[k].CountPackNum_Col;
}
if(CountAllPort_suc>=1000)break;
}
}
//——————————————以下是主函数————————————————
intmain(intargc,char*argv[])
{
srand((int)time(0));
Portprt[3];
prt[0]=Port(0.2);prt[1]=Port(0.2);prt[2]=Port(0.2);//设有三个站点,每个时槽内发包概率为0.2
SlottedAlohaA(1.0);//创建时槽,时槽长度为1
A.ALOHA(prt,3);
floatG,S;
G=A.CountAllPort_all/A.NowTime;
S=A.CountAllPort_suc/A.NowTime;
cout<<"成功发送包"<<<<"个,\n总共发送包"<\n"<cout<<"每包时尝试次数G="<cout<<"吞吐量S="<
getchar();
return0;
}
实验结果截图:
3.实验总结
这个分槽ALOHA仿真模拟实验难度比较大,就算对此协议比较了解,但要通过编程来实现,也不是容易的事。
况且以前从未做过类似的程序设计,对于我来说是个不小的挑战。
经过很久的设计、讨论和尝试,我总算在截止时间前完成了任务。
我的程序采用循环来代表时间流逝,用随机数来判断站点是否发包,成功地模拟了分槽ALOHA在物理介质的运行情况。
我的主程序比较随意,主要是为了测试,所以没有设多个情况。
默认只有三个站点,每个站点以0.2的概率发包,所以理论的G=0.6,S=0.329,而实际测试情况出入很小,符合理论预期,所以实验结果很成功!
如果进一步修改,可以测试不同的G和S,从而画出曲线,但限于时间和水平(C++中还不知道如何画图),这个环节暂时无法实现。
实验二网络路由层协议模拟实验
网络路由算法是路由器工作的核心,本实验针对因特网常用的距离向量路由算法和链路状态路由算法进行模拟实现,进一步掌握其工作原理及其相关性能。
【实验目的和要求】
1.掌握VB、VC++、VS或JAVA等集成开发环境编写路由仿真程序的方法;
2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。
【实验内容】(1,2任选其一实现)
1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。
基本要求(动态生成网络拓扑图,节点间的距离随机生成。
从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。
观察和讨论多少轮交换后路由表稳定)
2.实现链路状态路由算法的模拟。
基本要求(动态生成网络拓扑图,节点间的距离随机生成。
每个节点生成自己的链路状态分组,依据收到的链路状态表得到整体网络结构,在得到的整体网络结构上用最短路径算法,生成每个节点的路由表)
【编程语言和环境】
1.编程语言C/C++/C#/Java等均可;
2.编程环境Windows(MSVisual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GCC)均可;
【实验报告】
所交实验报告内容包括:
1.实验目的与要求;
2.实验内容与实现原理;
3.实验具体设计实现及结果(含流程图及关键代码说明);
4.实验设备与实验环境;
5.实验总结
1.实验内容与原理
我选择的实验1,模拟距离向量路由算法。
矢量路由算法是这样工作的:
每个路由维护一张表(即一个矢量),列出了当前已知到每个目标的最佳距离,以及所使用的链路。
这些表通过与邻居之间相互交换信息而不断被更新,最终每个路由器都了解到达每个目的地的最佳链路。
2.实验具体设计实现及结果
#include
#include
usingnamespacestd;
#defineINFINITY-1
#defineMAX_VERTEX_NUM10
typedefenum{DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网}
typedefintVRType;
typedefstringVertexType;
structArcCell
{
VRTypeadj;
//InfoType*info;
};
classMGraph
{
public:
//private:
VertexTypevexs[MAX_VERTEX_NUM];
ArcCellarc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
intvexnum;
intarcnum;
GraphKindkind;
//public:
voidCreateGraph_1();
boolCheckArc(inta,intb);
};
voidMGraph:
:
CreateGraph_1()
{
vexnum=7;arcnum=11;
for(inti=0;i<7;i++)vexs[i]='A'+i;
for(inti=0;i<7;i++)arc[i][i].adj=0;
arc[0][1].adj=4;arc[0][2].adj=INFINITY;arc[0][3].adj=9;arc[0][4].adj=2;arc[0][5].adj=INFINITY;arc[0][6].adj=INFINITY;
arc[1][2].adj=2;arc[1][3].adj=1;arc[1][4].adj=INFINITY;arc[1][5].adj=INFINITY;arc[1][6].adj=8;
arc[2][3].adj=INFINITY;arc[2][4].adj=10;arc[2][5].adj=INFINITY;arc[2][6].adj=6;
arc[3][4].adj=7;arc[3][5].adj=5;arc[3][6].adj=INFINITY;
arc[4][5].adj=INFINITY;arc[4][6].adj=INFINITY;
arc[5][6].adj=3;
for(inti=1;i<7;i++)
{
for(intj=0;j
}
for(inti=0;i<7;i++)
{
for(intj=0;j<7;j++)cout<cout<<'\n';
}cout<}
boolMGraph:
:
CheckArc(inta,intb)
{
if(arc[a][b].adj!
=-1&&arc[a][b].adj!
=0)returntrue;
elsereturnfalse;
}
structRouterTable
{
intdistance;
intvia_RouterID;//记录需经由的最短路径
};
classRouter
{
public:
RouterTabletable[MAX_VERTEX_NUM];//记录此路由节点到其他节点的最短路径,下标为其他节点ID,到自己为0
intRouterID;
Router(){RouterID=-1;}
Router(MGraph&G,intID);
voidObtainAdjRt(Router&R,intID,intvexnum);
voidPrintTable(intvexnum);
//voidDVR(RouterR[],intRtNum);
};
Router:
:
Router(MGraph&G,intID)
{
RouterID=ID;
for(intj=0;j{
table[j].distance=G.arc[ID][j].adj;
if(table[j].distance==-1)table[j].via_RouterID=-1;
elsetable[j].via_RouterID=j;
}
}
voidRouter:
:
ObtainAdjRt(Router&R,intID,intvexnum)//获取路由表的函数,R是自己的邻居节点
{
for(intj=0;j{
if(table[j].distance==-1&&R.table[j].distance>0){table[j].distance=table[R.RouterID].distance+R.table[j].distance;table[j].via_RouterID=R.RouterID;}
elseif(table[j].distance>R.table[j].distance&&R.table[j].distance!
=-1)//如果邻居节点有到j节点更短的距离
{if(table[j].distance>table[R.RouterID].distance+R.table[j].distance)
{table[j].distance=table[R.RouterID].distance+R.table[j].distance;table[j].via_RouterID=R.RouterID;}
}
}
}
voidRouter:
:
PrintTable(intvexnum)//输出这个路由器的路由表
{
for(inti=0;i{
cout<
"<}cout<<'\n';
}
voidDVR(RouterR[],MGraph&G,intRtNum)//距离矢量路由算法
{
for(inti=0;i{
for(intj=0;j{
if(G.CheckArc(i,j)){R[i].ObtainAdjRt(R[j],j,RtNum);}//则i路由获取j路由的路由表
}
}
}
intmain(intargc,char*argv[])
{
MGraphG;
G.CreateGraph_1();
Routerrt[7];
for(inti=0;i<7;i++)
{
rt[i]=Router(G,i);
}
intSwapNum=10;
for(inti=0;i{
DVR(rt,G,7);
rt[0].PrintTable(7);//输出第0号路由(A)的路由表
}
getchar();
return0;
}
实验结果截图:
(由于已经得到了最优的路由表,所以没有更新)
3.实验总结
本实验的过程比较顺利,网络的拓扑图是采用邻接矩阵存储,因为网络拓扑一般比较稠密。
实验结果很正确,可以快速得到所有路由的最优路由表。
首先得益于这个算法的优秀,其次是我事先留作测试用的网络比较小,一个路由节点做一次就可以得到最优路由表了,导致不能观看到路由表的更新。
通过本次试验,我加深了对距离向量路由算法的理解,同时也锻炼了编程技术。
展开阅读全文
相关搜索
资源标签