计算机网络实验指导书2016
计算机网络实验要求及指导
实验一 分槽ALOHA 协议仿真实验
用于在多路访问信道上确定下一个使用者的协议属于数据链路层的一个子层,称为介质
访问控制(Medium Access Control,MAC )子层,许多局域网都使用多路访问信道作为它的通信基础。最简单的信道分配方案是FDM (为每个站专门分配一段频率)和TDM (为每个站分配一个时槽),当站的数量比较大而且可变,或者流量具有突发性变化的时候,就需要用到纯ALOHA 协议或时隙ALOHA 协议。本实验模拟常见的几种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+编译器
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 start
if length(idx) > 0
State(idx) = TRANSMIT; %State为各站点在此时槽的状态
mtime(idx) = now_time + Mplen(idx) / Srate;
% 发送结束时间,Mplen 为数据包的长度,Srate 为发送的速率
mtime(idx) = round(mtime(idx)/slot) * slot;
Tplen = Tplen + sum(Mplen(idx));
%此时槽内所有包的总长度
end
idx = find(State==TRANSMIT | State==COLLISION);
if length(idx) > 1
State(idx) = COLLISION; % 当有两个以上数据包时,发生冲突
end
3) 若成功,则发送成功的数据包数加1,程序结束点也是成功的个数为10000时。然后根
据生成包的随机时间间隔,得出此站点下一次发送包的时间点。
idx = find(mtime==now_time & State==TRANSMIT);
% finding of the terminal which transmission succeeded
if length(idx) > 0
Spnum = Spnum + 1; %发送成功的数据包数加1
Splen = 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;
% 归并到时槽的开始点
end
4) 若发生冲突,根据随机后退时间,得出此站点下一次发送包的时间点。
idx = find(mtime==now_time & State==COLLISION);
% finding of the terminal which transmission failed
if length(idx) > 0
State(idx) = STANDBY;
mtime(idx) = now_time + [ Ttime / log(1-X/Mnum) ] * log(rand(1,length(idx)));
% 站点等待的时间,下次重发此数据包的时间点
mtime(idx) = (fix(mtime(idx)/slot)+1) * slot; % 归并到时槽的开始处
end
5) 依次循环上述过程,直至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/VS.Net;)和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/VS.Net;)和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. 一台计算机要加入某一个组,然后接收发往这个组的信息。Socket 类要调用SetSocketOption 函数加入和离开某一个组。UdpClient 类有直接的加入和离开某个组的成员函数可以调用。而向某个组发信息,则没有什么特殊的,只需把发送数据的目的地址设为组播地址就可以了。
发送端:
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.0.0.1"), 3000);
EndPoint ep = (EndPoint)iep;
byte[] b = Encoding.ASCII.GetBytes("just a test!");
s.SendTo(b, ep);
s.Close();
接收端:
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 3000);
EndPoint ep=(EndPoint)iep;
s.Bind(iep);
s.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.AddMembership,new MulticastOption(IPAddress.Parse("224.0.0.1")));
byte[]b=new byte[1024];
s.ReceiveFrom(b,ref ep);
string test;
test = System.Text.Encoding.ASCII.GetString(b);
Console.WriteLine(test);
s.Close();
Console.ReadKey();
3. 广播功能
此功能和组播功能实现类似,只要在发送端获得子网中IP 广播地址发送休息即可。 // 广播模式(自动获得子网中的IP 广播地址)
broadcastIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 3000);