计算机网络实验指导书2015-修改

  • 格式:doc
  • 大小:69.50 KB
  • 文档页数:8

计算机网络实验要求及指导实验时间5月17日1-2节8:00-9:40 6月14日1-2节8:00-9:40实验一分槽ALOHA协议仿真实验用于在多路访问信道上确定下一个使用者的协议属于数据链路层的一个子层,称为介质访问控制(Medium Access Control,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(MS Visual系列,VC/VB/;)和Linux(编辑器vi+编译器GCC)均可;【实验报告】所交实验报告内容包括:1.实验目的与要求;2.实验内容与实现原理;3.实验具体设计实现及结果(含流程图及关键代码说明);4.实验设备与实验环境;5.实验总结【主要功能实现说明】1.仿真思路设置各站点初始产生包的时间点及产生包的时间间隔(均为随机值),得到所有站点成功发送10000个数据包的总时间以及这段时间内所有数据包的个数(包括各站点每次新产生的包以及由于冲突而重发的包),从而计算出每包时内尝试次数及其对应的吞吐量。

针对不同的包产生间隔,得到不同的每包时内尝试次数及其对应的吞吐量,将其画成一条曲线。

2.具体步骤(示例代码为matlab)1)初始化各站点产生包的时间点(可采用0到1的随机数),统一归并到时槽开始的时间点。

Mgtime =[ Ttime / log(1-X/Mnum) ]* log(rand(1,Mnum));% 初始化各站点包产生的时间点,为[0,1]的随机数mtime = (fix(mgtime/slot)+1) * slot;% 各站点数据包发送时间点,归并到时槽的开始处其中:Ttime为发送一个包所需的时间,Mnum为站点的总个数,可通过改变不同的X 值得到不同的包产生时间点。

X的取值小于站点总个数2)选出最早产生数据包的站点作为初始发送站点,若此时槽只有一个数据包,则发送成功;若有两个以上数据包,则冲突。

记录此时槽内所有包的个数idx = find(mtime==now_time);% finding of the terminal which transmission startif length(idx) > 0State(idx) = TRANSMIT; %State为各站点在此时槽的状态mtime(idx) = now_time + Mplen(idx) / Srate;% 发送结束时间,Mplen为数据包的长度,Srate为发送的速率mtime(idx) = round(mtime(idx)/slot) * slot;Tplen = Tplen + sum(Mplen(idx));%此时槽内所有包的总长度endidx = find(State==TRANSMIT | State==COLLISION);if length(idx) > 1State(idx) = COLLISION; % 当有两个以上数据包时,发生冲突end3)若成功,则发送成功的数据包数加1,程序结束点也是成功的个数为10000时。

然后根据生成包的随机时间间隔,得出此站点下一次发送包的时间点。

idx = find(mtime==now_time & State==TRANSMIT);% finding of the terminal which transmission succeededif length(idx) > 0Spnum = Spnum + 1; %发送成功的数据包数加1Splen = Splen + Mplen(idx);%总共发送成功数据包的长度(计算吞吐量)State(idx) = STANDBY;%设置此站点发送状态为等待mgtime(idx) = now_time + [ Ttime / log(1-X/Mnum) ] * log(1-rand);% 算出此站点下次产生的时间点mtime(idx) = (fix(mgtime(idx)/slot)+1) * slot;% 归并到时槽的开始点end4)若发生冲突,根据随机后退时间,得出此站点下一次发送包的时间点。

idx = find(mtime==now_time & State==COLLISION);% finding of the terminal which transmission failedif length(idx) > 0State(idx) = STANDBY;mtime(idx) = now_time + [ Ttime / log(1-X/Mnum) ] * log(rand(1,length(idx)));% 站点等待的时间,下次重发此数据包的时间点mtime(idx) = (fix(mtime(idx)/slot)+1) * slot; % 归并到时槽的开始处end5)依次循环上述过程,直至10000个数据包成功发送。

计算出每包时内传输次数及其吞吐量traffic = Tplen / Srate / now_time; %每包时内传输次数%总共传输的包(包括站点新产生的包及由于冲突重传的包)的总长度除以发送速率再除以发送完最后一个包的时间thoughput=Splen/Srate/now_time;%吞吐量%成功传输的包的总长度除以发送速率再除以发送完最后一个包的时间实验二网络路由层协议模拟实验网络路由算法是路由器工作的核心,本实验针对因特网常用的距离向量路由算法和链路状态路由算法进行模拟实现,进一步掌握其工作原理及其相关性能。

【实验目的和要求】1.掌握VB、VC++、VS或JAVA等集成开发环境编写路由仿真程序的方法;2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。

;【实验内容】(1,2任选其一实现)1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。

基本要求(动态生成网络拓扑图,节点间的距离随机生成。

从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。

观察和讨论多少轮交换后路由表稳定)2.实现链路状态路由算法的模拟。

基本要求(动态生成网络拓扑图,节点间的距离随机生成。

每个节点生成自己的链路状态分组,依据收到的链路状态表得到整体网络结构,在得到的整体网络结构上用最短路径算法,生成每个节点的路由表)进一步的要求:可以将模拟实验的每个节点程序部署在不同的电脑上,通过socket通信程序完成路由表信息或者链路状态分组的发送(与实验三结合)。

请用两台机器虚拟成多个网络节点(一台机器上开启多个通信进程,每个进程虚拟成一个节点),完成每个虚拟节点的路由表生成,进而按照路由表转发数据包。

【编程语言和环境】1.编程语言C/C++/C#/Java等均可;2.编程环境Windows(MS Visual系列,VC/VB/;)和Linux(编辑器vi+编译器GCC)均可;【实验报告】所交实验报告内容包括:1.实验目的与要求;2.实验内容与实现原理;3.实验具体设计实现及结果(含流程图及关键代码说明);4.实验设备与实验环境;5.实验总结实验三Socket通信实验网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。

本实验利用Socket API 编写网络通信程序,具体实验要求及内容如下。

【实验目的和要求】3.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;4.掌握客户/服务器(C/S)应用的工作方式;5.学习网络中进程之间通信的原理和实现方法;6.理解单播、组播和广播的原理并比较其不同之处;7.要求本机既是客户端又是服务器端;【实验内容】所编写的程序应具有如下功能:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;【编程语言和环境】3.编程语言C/C++/C#/Java等均可;4.编程环境Windows(MS Visual系列,VC/VB/;)和Linux(编辑器vi+编译器GCC)均可;【实验报告】所交实验报告内容包括:6.实验目的与要求;7.实验内容与实现原理;8.实验具体设计实现及结果(含流程图及关键代码说明);9.实验设备与实验环境;10.实验总结【实验主要功能实现说明】以下为针对三个实验内容实现方法的简要说明,示例所用语言为C#。

1.点对点通信功能实现网络点对点通讯程序的关键步骤就是实现信息在网络中的发送和接收。

数据接收使用的是Socket,数据发送使用的是NetworkStream。

1.1利用Socket来接收信息TcpListener tlListen1 = new TcpListener ( 8889 ) ;//侦听端口号tlListen1.Start ( ) ;Socket skSocket = tlListen1.AcceptSocket ( ) ;//接受远程计算机的连接请求,并获得用以接收数据的Socket实例EndPoint tempRemoteEP = skSocket.RemoteEndPoint ;//获得远程计算机对应的网络远程终结点while ( true ){Byte [] byStream = new Byte[80] ;//定义从远程计算机接收到数据存放的数据缓冲区int i = skSocket.ReceiveFrom ( byStream , ref tempRemoteEP ) ;//接收数据,并存放到定义的缓冲区中string sMessage = System.Text.Encoding.UTF8.GetString ( byStream ) ;//以指定的编码,从缓冲区中解析出内容MessageBox.Show ( sMessage ) ;//显示传送来的数据}1.2利用NetworkStream来传送信息TcpClient tcpc = new TcpClient ( "10.138.198.213" , 8888 ) ;//对IP地址为“10.138.198.213”的计算机的8888端口提出连接申请NetworkStream tcpStream = tcpc.GetStream ( ) ;//如果连接申请建立,则获得用以传送数据的数据流string sMsg = "您好,见到您很高兴" ;StreamWriter reqStreamW = new StreamWriter ( tcpStream ) ;//以特定的编码往向数据流中写入数据 ,默认为UTF8编码reqStreamW.Write ( sMsg ) ;//将字符串写入数据流中reqStreamW.Flush ( ) ;//清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流2.群组通信功能组播编程需要UDP,有两个类支持组播网络编程Socket和UdpClient.一台计算机要加入某一个组,然后接收发往这个组的信息。