APP下载

计算机网络启发式NS-3仿真案例教学模式

2018-10-30蔡文郁刘晓玲

实验室研究与探索 2018年9期
关键词:路由客户端无线

蔡文郁, 刘晓玲

(杭州电子科技大学 电子信息学院,杭州 310018)

0 引 言

《计算机网络系统》[1]是本科教学体系中的一个重要分支,其旨在让学生掌握抽象的计算机网络系统知识的同时,并能通过自己的操作和改进的协议进行网络性能仿真结果的分析,如果只靠黑板教学是难以达到这一教学目标。网络仿真[3]是通过计算机技术搭建网络结构和实现网络协议的模拟网络行为,是一项重要的计算机网络仿真技术。相比于搭建一个实验室测试网络平台,网络仿真技术可以使用相对较少的时间和较低的费用基本实现所需要研究的网络模型,作为《计算机网络系统》课程中一种重要的辅助实验手段。NS-3[4]作为一种开源、免费的网络仿真软件,可以实现对大部分网络协议的仿真,其具有开源性,学生可以在其提供的已有的模块下进行改进,大大提升学生的学习兴趣。本文将这种开源的网络仿真软件NS-3应用在计算机网络课程的教学过程中,通过设计一些启发式实验案例,让学生了解NS-3仿真软件,让学生对网络通信协议有直观深入的理解,进而提高教学效果。

1 NS-3网络仿真平台

网络仿真(Network Simulator-3,NS-3)是一种旨在学术研究和教学需要的离散事件模拟器,其在可扩展性、移植性、开源性和完整性等方面的特征都优于现有的大多数网络模拟器。NS-3可以构建各种网络结构,可以仿真模拟各种协议并对其进行比较和改进。NS-3中的模块支持两种语言编写,分别是C++和Python。NS-3的仿真结果有静态和动态两种形式,其中静态结果有文本文件和图表方式,动态图包括离线动画演示工具NetAnim和在线可视化模块PyViz。NS-3组织结构[5]和模型间的依赖关系如图1所示,依次为核心模块(Core)、网络模块(Network)、互联网模块(Internet)、移动模块(Mobility)、应用模块(Applications)和Helper类。每个模块都有自己的类和实现方法,各个模块相互独立和实现功能。NS-3这种分层次的模块组织结构,类似于TCP/IP协议,使各层各负其责,在物理上、逻辑上相互独立,便于研究者设计自己的网络模型。

图1 NS-3组织结构

NS-3网络仿真平台搭建包括8个步骤,如图2所示。

图2 NS-3仿真平台搭建流程图

2 启发式案例设计

2.1 有线无线混合实验案例

此案例的网络结构如图3所示,多个无线客户端节点需要访问PC服务器节点,其中无线客户端节点首先与无线AP节点连接,无线AP节点通过以太网连接PC服务器。该案例通过NS-3仿真演示实现有线网络和无线网络的混合通信,仿真过程的动画演示使用PyViz辅助工具,让学生掌握无线WiFi通信技术以及异型网络的综合使用能力。

图3 网络仿真场景

2.1.1仿真场景

仿真网络结构如图4所示,n5、n6是WiFi移动节点,n0是无线访问节点(Access Point,AP),n1~n4是有线局域网,n0和n1是点到点的通信链路[10]。

图4 网络仿真场景

2.1.2仿真脚本的关键代码

//“include”函数来引入NS-3中已编译模块,如:点到点模块(point-to-point)、移动模块(mobility)等。

#include "ns3/point-to-point-module.h"

#include "ns3/mobility-module.h"

//此代码中使用了NS-3提供的日志模块功能,可根据Logging给出的信息点网络环境进行程序调试。

NS_LOG_COMPONENT_DEFINE ("ThirdScriptExample");

//通过调用CommandLine命令为程序引入命令行模式,用户通过命令行模式去设定参数来改变程序中参数值,

CommandLine cmd; cmd.Parse (argc,argv);

//创建2个节点用于连接点到点链路

NodeContainer p2pNodes; p2pNodes.Create (2);

//构建点对点连接,通过PointToPointHelper类设置网络节点的点到点链路的网络设备和信道属性

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

//借用Install方法将设备安装到节点中

NetDeviceContainer p2pDevices;

p2pDevices = pointToPoint.Install (p2pNodes);

//创建3个以太网网络节点,并将点到点节点容器中的第一个节点加入到CSMA设备的节点容器

NodeContainer csmaNodes; csmaNodes.Add (p2pNodes.Get (1)); csmaNodes.Create (3);

//通过CsmaHelper类设置网络节点的以太网的网络设备和信道属性,并用Install方法将设备安装到节点中

CsmaHelper csma;

csma.SetChannelAttribute ("DataRate", StringValue

("100Mbps"));

csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));

NetDeviceContainer csmaDevices; csmaDevices = csma.Install (csmaNodes);

//创建2个WiFi网络节点,再将剩余的一个点到点链路节点作为接入点AP

NodeContainer WiFiStaNodes; WiFiStaNodes.Create (2); NodeContainer WiFiApNode = p2pNodes.Get (0);

//通过配置PHY和通道助手来构建无线设备和无线节点之间的互连通道

YansWiFiChannelHelper channel = YansWiFiChannelHelper::Default ();

YansWiFiPhyHelper phy = YansWiFiPhyHelper::Default ();

WiFiHelper WiFi;

WiFi.SetRemoteStationManager ("ns3::AarfWiFiManager");

WiFiMacHelper mac;

staDevices = WiFi.Install (phy, mac, WiFiStaNodes);

//配置AP节点

mac.SetType ("ns3::ApWiFiMac", "Ssid", SsidValue (ssid));

NetDeviceContainer apDevices;

apDevices = WiFi.Install (phy, mac, WiFiApNode);

//使用MobilityHelper类设置WiFi节点的初始位置和移动模型

MobilityHelper mobility;

mobility.SetPositionAllocator ("ns3::GridPositionAllocator",

"MinX", DoubleValue (-50.0), "MinY", DoubleValue (50.0),

"DeltaX", DoubleValue (5.0),"DeltaY", DoubleValue (-50.0),

"GridWidth", UintegerValue (1),"LayoutType", StringValue ("RowFirst"));

//WiFi节点的移动模型是随机游走模型:RandomWalk2dMobilityModel

mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",

"Bounds", RectangleValue (Rectangle (-150, 150, -150, 150)));

//通过InternetStackHelper类安装协议栈

InternetStackHelper stack; stack.Install (csmaNodes);stack.Install (WiFiApNode); stack.Install (WiFiStaNodes);

//配置IP地址,点到点链路节点在网段10.1.1.0/24,CSMA节点在网段10.1.2.0/24,WiFi节点在网段10.1.3.0/24

Ipv4AddressHelper address;

address.SetBase ("10.1.1.0", "255.255.255.0"); p2pInterfaces = address.Assign (p2pDevices);

address.SetBase ("10.1.2.0", "255.255.255.0"); csmaInterfaces = address.Assign (csmaDevices);

address.SetBase ("10.1.3.0", "255.255.255.0"); address.Assign (staDevices);address.Assign (apDevices);

//设置以太网节点3为echo服务端程序,同时设置服务器启动时间。

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (3));

serverApps.Start (Seconds (1.0));

//设置WiFi网络中的一个节点为客户端,并配置相关属性

UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);

echoClient.SetAttribute ("MaxPackets", UintegerValue (100));

ApplicationContainer clientApps = echoClient.Install (WiFiStaNodes.Get (nWiFi - 1));

//启用互联网络路由作用与建立好的互连网络

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

//运行模拟、清空、退出程序

Simulator::Run (); Simulator::Destroy (); return 0;

2.1.3仿真实验及结果分析

仿真结果分析:根据图5(a)和(b)可以直观生动的看出节点之间的数据流动。从图6可以看出,在终端中输入编译代码并执行脚本,从输出的日志信息可以看出模拟通信场景运行到2 s时客户端发送1 024 Byte给地址为10.1.2.4的服务器,客户端和服务器处于不同的网段。之后服务器收到来自10.1.3.2客户端的数据分组,同时发送相同字节给客户端,而且客户端成功接收。可以看到仿真结果与程序中设定的发送数据包的时间点和数据包发送的发送端和接收端完全一致。

(a) 初始仿真场景

(b) 混合通信场景

图5 混合通信仿真场景

图6 编译结果

2.2 点到点中继通信实验案例

如图7所示,节点之间采用点到点通信,且节点均处于静止状态,采用添加中继节点的方式实现节点的数据连通。此案例主要用于演示点到点中继通信的原理,提高学生中继通信的感官认识,从而激发学生学习并掌握短距离无线组网技术的兴趣。

图7 网络仿真场景

2.2.1仿真场景

本仿真场景中一共设置了10个节点,如图8所示,其中n2~n11均位于不同的网段,n0和n1属于中继节点,并且设置节点n4和节点n9进行通信。

图8 网络仿真场景

2.2.2仿真脚本的关键代码

#include "ns3/netanim-module.h"

//构建网络拓扑结构,如:设置节点0分别与节点1、2、3、4、5和6连接

pAnim->UpdateLinkDescription (0, 1, oss.str ());

pAnim->UpdateLinkDescription (0, 2, oss.str ());

pAnim->UpdateLinkDescription (0, 3, oss.str ());

pAnim->UpdateLinkDescription (0, 4, oss.str ());

pAnim->UpdateLinkDescription (0, 5, oss.str ());

pAnim->UpdateLinkDescription (0, 6, oss.str ());

// 设置 IP地址

d.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"),

Ipv4AddressHelper ("10.2.1.0", "255.255.255.0"),

Ipv4AddressHelper ("10.3.1.0", "255.255.255.0"));

// 生成XML文件

std::string animFile = "dynamic_linknode.xml" ;

pAnim = new AnimationInterface (animFile);

2.2.3仿真实验及结果分析

仿真结果采用两种可视化界面PyViz和NetAnim方式观测,如图9所示。仿真结束后使用NetAnim读取程序执行过程中生成的XML文件,可离线演示网络拓扑结构和节点间数据分组流动等动画过程。

2.3 无线多跳网络实验案例

此仿真的场景是多跳无线网络Ad Hoc[11],如图10所示,其结构采用一种省略无线中介设备AP而搭建起来的对等网络结构,只需要安装无线网卡,就可以实现计算机之间的通信。对于多跳无线自组网络来说,路由协议是非常重要的。其中主动路由协议和按需路由协议较为典型,因此仿真了DSR和DSDV两种路由协议的建立路径的过程和结果分析。此案例主要用于演示无线多跳网络的工作原理以及不同路由协议的性能比较,提升学生参与网络传输核心路由协议设计的学习热情。

2.3.1仿真场景

本案例是基于Ad-Hoc网络[12-14],设置了20个可随机移动的节点,其中节点2(Node2)为数据发送端,节点0(Node0)为数据接收端。

(a) 点到点通信可视化界面

(b) 仿真拓扑结构图

(c) 数据分组统计

(d) 节点9发送数据

(e) 途径节点1和节点0

(f) 节点4发送数据

图9 无线中继通信演示

图10 网络仿真场景

2.3.2仿真脚本的关键代码

//设置节点的移动模型为随机路径

adhocMobility.SetMobilityModel ("ns3::RandomWaypoint MobilityModel",

"Speed", StringValue (speedUniformRandomVariable Stream.str ()),

"Pause", StringValue (pauseConstantRandomVariable Stream.str ()),

"PositionAllocator", PointerValue (taPositionAlloc));

adhocMobility.Install (adhocNodes);

//通过DsdvHelper类引入DSDV路由协议,同理也可以引入DSR路由协议。

DsdvHelper dsdv; InternetStackHelper stack; stack.SetRoutingHelper (dsdv);

//设置节点0为数据接收端,节点2为数据发送端,且设置节点2在20 s时开始发送数据

ApplicationContainer apps_sink = sink.Install (adhocNodes.Get (0));

apps_sink.Start (Seconds (20.0));

OnOffHelper onoff1 ("ns3::UdpSocketFactory", Address (InetSocketAddress (allInterfaces.GetAddress (0), port)));

onoff1.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1.0]"));

onoff1.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0.0]"));

ApplicationContainer apps1 = onoff1.Install

(adhocNodes.Get (2));

2.3.3仿真实验及结果分析

仿真结果如图11所示。

(a) DSDV协议Node2节点泛洪广播

(b) DSDV协议Node2找到的第1条路径

(c) DSDV协议Node2找到的第2条路径

(d) DSR协议泛洪广播

(e) DSR协议Node2找到的第1条路径

(f) DSR协议Node2找到的第2条路径

从可视化动态仿真过程图中,可以直观地看出在同一种动态变化的网络拓扑结构的仿真场景。DSR协议比DSDV协议寻找到两节点通信路径所花费的时间要少,这是因为在动态变化的网络拓扑结构下,由于邻居信息表需要实时更新,主动路由协议额外负荷较高。

3 结 语

本文将NS-3网络仿真平台引入到《计算机网络系统》课程的教学中,通过在NS-3中构建设计的3种不同网络通信协议启发式案例,运用NS-3中多样化的仿真方式,如Logging、动画演示工具(NetAnim)和可视化模块(PyViz)等,将网络课程中抽象的理论知识形象直观地呈现在学生面前,使学生对网络知识点有了较为直观的了解,进而激发学生探索网络知识的欲望,起到事半功倍的效果。当学生熟练掌握NS-3的模块内容和执行方式后,还可以继续引导学生向更深层次的计算机网络协议的核心实现与编程技术,为后续课程的学习奠定了一定基础。

猜你喜欢

路由客户端无线
《无线互联科技》征稿词(2021)
铁路数据网路由汇聚引发的路由迭代问题研究
如何看待传统媒体新闻客户端的“断舍离”?
无线追踪3
基于ARM的无线WiFi插排的设计
一种PP型无线供电系统的分析
探究路由与环路的问题
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路