1、计算机网络实验报告学生姓名 学 号 专业班级 指导教师 学 院 信息科学与工程学院 完成时间 2014年5月实验一 分槽ALOHA协议仿真实验 用于在多路访问信道上确定下一个使用者的协议属于数据链路层的一个子层,称为介质访问控制(Medium Access Control,MAC)子层,许多局域网都使用多路访问信道作为它的通信基础。最简单的信道分配方案是FDM(为每个站专门分配一段频率)和TDM(为每个站分配一个时槽),当站的数量比较大而且可变,或者流量具有突发性变化的时候,就需要用到纯ALOHA协议或分槽ALOHA协议。如果信道的状态可以被检测到,可以用到1-坚持型CSMA、非坚持CSMA和
2、P-坚持CSMA等协议。本实验模拟常见的几种MAC层多路访问协议,具体实验要求及内容如下。【实验目的】1.掌握VB、VC+、VS或JAVA等集成开发环境编写仿真程序的方法;2.理解并掌握分槽ALOHA协议原理。【实验内容】编写仿真程序,对一定网络环境下MAC层的多路访问协议的分槽ALOHA协议进行实现。通过仿真,学习协议采取的介质访问管理,包括介质分配和冲突解决机制,并对协议的性能与理论结果进行比较分析。【编程语言和环境】1.编程语言C/C+/C#/Java/Matlab等均可;2.编程环境Windows(MS Visual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GC
3、C)均可;【实验报告】所交实验报告内容包括:1.实验目的与要求;2.实验内容与实现原理;3.实验具体设计实现及结果(含流程图及关键代码说明);4.实验设备与实验环境;5.实验总结1.实验内容与原理设置各站点初始产生包的时间点及产生包的时间间隔(均为随机值),得到所有站点成功发送1000个数据包的总时间以及这段时间内所有数据包的个数(包括各站点每次新产生的包以及由于冲突而重发的包),从而计算出每包时内尝试次数及其对应的吞吐量。2. 实验具体设计实现及结果#include #include#includeusing namespace std;#define MAX_PORT_NUM 5class
4、 Port public: float P;/站点发包概率 0P1 int Apply;/站点状态0=空闲,1=请求发送 float PackTime; int CountPackNum_Suc; int CountPackNum_Col; Port()P=0.5;CountPackNum_Suc=0;CountPackNum_Col=0;ChangeApply(0); Port(float p)P=p;CountPackNum_Suc=0;CountPackNum_Col=0;ChangeApply(0); void ChangeApply(float NowTime);void Port:
5、ChangeApply(float NowTime) float P1=(rand()%1000)/1000.0; if(P1P) Apply=1; else Apply=0; PackTime=NowTime;class SlottedAloha public: float SlotTime; float NowTime; int CurrentMAX_PORT_NUM;/记录当前时槽内要发送的包,及发包站点,成为“包缓存” int CountAllPort_suc; int CountAllPort_all; SlottedAloha(float t)SlotTime=t;NowTime=
6、0;CountAllPort_suc=0;CountAllPort_all=0; void ALOHA(Port prt,int n);void SlottedAloha:ALOHA(Port prt,int n) for(int i=0;i+)/用一个死循环代表时间流逝,如果成功发送包达到1000则break NowTime=SlotTime*i; int PackLen=0;/记录时槽内要发包的总长度(个数) for(int k=0;kn;k+) if(prtk.Apply=1&prtk.PackTime=NowTime) Currentk=1;PackLen+; else Current
7、k=0; if(PackLen=1)/只有一个包,可以发 for(int k=0;k1)/有多个包,冲突 for(int k=0;kn;k+)/给所有当前冲突的包下一个随机发送时间 if(Currentk=1) prtk.ChangeApply(NowTime+SlotTime*(rand()%n+1);prtk.CountPackNum_Col+; /冲突数+ else if(prtk.Apply=0) prtk.ChangeApply(NowTime+SlotTime); else if(PackLen=0)/无包发送 for(int k=0;kn;k+) if(prtk.Apply=0)
8、 prtk.ChangeApply(NowTime+SlotTime); CountAllPort_suc=0;CountAllPort_all=0; for(int k=0;k=1000) break; /以下是主函数 int main(int argc, char *argv) srand(int)time(0); Port prt3; prt0=Port(0.2);prt1=Port(0.2);prt2=Port(0.2);/设有三个站点,每个时槽内发包概率为0.2 SlottedAloha A(1.0);/创建时槽,时槽长度为1 A.ALOHA(prt,3); float G,S; G
9、=A.CountAllPort_all/A.NowTime; S=A.CountAllPort_suc/A.NowTime; cout成功发送包A.CountAllPort_suc个,n冲突包 A.CountAllPort_all-A.CountAllPort_suc 个,n总共发送包A.CountAllPort_all个。nendl; cout每包时尝试次数G = Gendl; cout吞吐量S = Sendl; getchar(); return 0;实验结果截图:3. 实验总结这个分槽ALOHA仿真模拟实验难度比较大,就算对此协议比较了解,但要通过编程来实现,也不是容易的事。况且以前从未
10、做过类似的程序设计,对于我来说是个不小的挑战。经过很久的设计、讨论和尝试,我总算在截止时间前完成了任务。我的程序采用循环来代表时间流逝,用随机数来判断站点是否发包,成功地模拟了分槽ALOHA在物理介质的运行情况。我的主程序比较随意,主要是为了测试,所以没有设多个情况。默认只有三个站点,每个站点以0.2的概率发包,所以理论的G=0.6,S=0.329,而实际测试情况出入很小,符合理论预期,所以实验结果很成功!如果进一步修改,可以测试不同的G和S,从而画出曲线,但限于时间和水平(C+中还不知道如何画图),这个环节暂时无法实现。实验二 网络路由层协议模拟实验 网络路由算法是路由器工作的核心,本实验针
11、对因特网常用的距离向量路由算法和链路状态路由算法进行模拟实现,进一步掌握其工作原理及其相关性能。【实验目的和要求】1.掌握VB、VC+、VS或JAVA等集成开发环境编写路由仿真程序的方法;2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。【实验内容】(1,2任选其一实现)1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。基本要求(动态生成网络拓扑图,节点间的距离随机生成。从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。观察和讨论多少轮交换后路由表稳定)2.实现链路状态路由算法的模拟。基本要求(动态生成网络拓扑图,节点间的距离随机生成。每个节点生成自
12、己的链路状态分组,依据收到的链路状态表得到整体网络结构,在得到的整体网络结构上用最短路径算法,生成每个节点的路由表)【编程语言和环境】1.编程语言C/C+/C#/Java等均可;2.编程环境Windows(MS Visual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GCC)均可;【实验报告】所交实验报告内容包括:1.实验目的与要求;2.实验内容与实现原理;3.实验具体设计实现及结果(含流程图及关键代码说明);4.实验设备与实验环境;5.实验总结1.实验内容与原理我选择的实验1,模拟距离向量路由算法。矢量路由算法是这样工作的:每个路由维护一张表(即一个矢量),列出了当前已
13、知到每个目标的最佳距离,以及所使用的链路。这些表通过与邻居之间相互交换信息而不断被更新,最终每个路由器都了解到达每个目的地的最佳链路。2. 实验具体设计实现及结果#include #include using namespace std;#define INFINITY -1#define MAX_VERTEX_NUM 10typedef enumDG,DN,UDG,UDN GraphKind; /有向图,有向网,无向图,无向网typedef int VRType;typedef string VertexType;struct ArcCell VRType adj; /InfoType *i
14、nfo; ;class MGraph public: /private: VertexType vexsMAX_VERTEX_NUM; ArcCell arcMAX_VERTEX_NUMMAX_VERTEX_NUM; int vexnum; int arcnum; GraphKind kind; /public: void CreateGraph_1(); bool CheckArc(int a,int b);void MGraph:CreateGraph_1() vexnum=7;arcnum=11; for(int i=0;i7;i+) vexsi=A+i; for(int i=0;i7;
15、i+) arcii.adj=0; arc01.adj=4;arc02.adj=INFINITY;arc03.adj=9;arc04.adj=2;arc05.adj=INFINITY;arc06.adj=INFINITY; arc12.adj=2;arc13.adj=1;arc14.adj=INFINITY;arc15.adj=INFINITY;arc16.adj=8; arc23.adj=INFINITY;arc24.adj=10;arc25.adj=INFINITY;arc26.adj=6; arc34.adj=7;arc35.adj=5;arc36.adj=INFINITY; arc45.
16、adj=INFINITY;arc46.adj=INFINITY; arc56.adj=3; for(int i=1;i7;i+) for(int j=0;ji;j+) arcij.adj=arcji.adj; for(int i=0;i7;i+) for(int j=0;j7;j+) coutarcij.adj,; coutn; coutendl; bool MGraph:CheckArc(int a,int b) if(arcab.adj!=-1&arcab.adj!=0)return true; else return false;struct RouterTable int distan
17、ce; int via_RouterID;/记录需经由的最短路径 ;class Router public: RouterTable tableMAX_VERTEX_NUM;/记录此路由节点到其他节点的最短路径,下标为其他节点ID,到自己为0 int RouterID; Router()RouterID=-1; Router(MGraph &G,int ID); void ObtainAdjRt(Router &R,int ID,int vexnum); void PrintTable(int vexnum); /void DVR(Router R, int RtNum);Router:Rou
18、ter(MGraph &G,int ID) RouterID=ID; for(int j=0;jG.vexnum;j+) tablej.distance=G.arcIDj.adj; if(tablej.distance=-1)tablej.via_RouterID=-1; else tablej.via_RouterID=j; void Router:ObtainAdjRt(Router &R,int ID,int vexnum)/获取路由表的函数,R是自己的邻居节点 for(int j=0;j0)tablej.distance=tableR.RouterID.distance+R.table
19、j.distance; tablej.via_RouterID=R.RouterID; else if(tablej.distanceR.tablej.distance&R.tablej.distance!=-1)/如果邻居节点有到j节点更短的距离 if(tablej.distancetableR.RouterID.distance+R.tablej.distance) tablej.distance=tableR.RouterID.distance+R.tablej.distance; tablej.via_RouterID=R.RouterID; void Router:PrintTabl
20、e(int vexnum)/输出这个路由器的路由表 for(int i=0;ivexnum;i+) couttablei.distance via:char(A+tablei.via_RouterID)endl; coutn;void DVR(Router R,MGraph &G,int RtNum) /距离矢量路由算法 for(int i=0;iRtNum;i+)/此循环为了让每个路由器访问一遍邻节点 for(int j=0;jRtNum;j+)/如果j号路由是i号路由的邻节点 if(G.CheckArc(i,j) Ri.ObtainAdjRt(Rj,j,RtNum);/则i路由获取j路由的
21、路由表 int main(int argc, char *argv) MGraph G; G.CreateGraph_1(); Router rt7; for(int i=0;i7;i+) rti=Router(G,i); int SwapNum=10; for(int i=0;iSwapNum;i+)/做SwapNum次交换 DVR(rt,G,7); rt0.PrintTable(7);/输出第0号路由(A)的路由表 getchar(); return 0;实验结果截图:(由于已经得到了最优的路由表,所以没有更新)3. 实验总结本实验的过程比较顺利,网络的拓扑图是采用邻接矩阵存储,因为网络拓扑一般比较稠密。实验结果很正确,可以快速得到所有路由的最优路由表。首先得益于这个算法的优秀,其次是我事先留作测试用的网络比较小,一个路由节点做一次就可以得到最优路由表了,导致不能观看到路由表的更新。通过本次试验,我加深了对距离向量路由算法的理解,同时也锻炼了编程技术。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1