参考文献:开源网络模拟器ns-3 架构与实践
我们构建了一个包含点对点PPP和CSMA有线网络,以及Wi-Fi无线网络混合场景。
思考与巩固
PPP网络如何建立?
为什么有双模结点?双模结点为什么要设置路由?
数据追踪追踪什么?我们可以运用数据追踪做什么?
有线网络与无线网络的设置?
头文件
头文件包括Wi-Fi、移动和CSMA3个模块。
Log系统的使用方法
NS_LOG_COMPONENT_DEFINE
下面这行代码作用是允许在该脚本中使用Log系统中的宏定义打印辅助信息,如打印调试信息的NS_LOG_DEBUG宏和打印错误信息的NS_LOG_ERROR宏等。
创建网络拓扑
包含以下三个部分:PPP、CSMA网络和WiFi网络
PPP网络
如同first.cc脚本中的点对点信道,一个网络拓扑由若干结点以及连接这些结点的信道组成。在ns-3中,结点和信道被分别抽象为Node、Channel以及结点中连接信道的网络设备NetDevice类这三个C++类。不同类型的信道对应不同的NetDevice、NetDevice子类。例如,PPP信道对应的网络设备类是PointToPointNetDevice,信道类是PointToPointChannel。一般来说,NetDevice主要负责实现的是链路层协议,Channel主要负责实现物理层协议。
NodeContainer p2pNodes;p2pNodes.Create (2);PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));NetDeviceContainer p2pDevices;p2pDevices = pointToPoint.Install (p2pNodes);
CSMA网络
PPP和CSMA(Carrier Sence Multiple Access)都属于有线网络技术。二者的区别在于PPP信道只能连接两个结点,是专属信道。而CSMA信道可以连接多个结点(总线型网络),需要结点竞争信道使用权(如何竞争?)。
NodeContainer csmaNodes;csmaNodes.Add (p2pNodes.Get (1));//双接口结点csmaNodes.Create (nCsma);CsmaHelper csma;csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));//传输速度为100Mbps,传播延迟6560nsNetDeviceContainer csmaDevices;csmaDevices = csma.Install (csmaNodes);
CSMA网络拓扑的创建与PPP网络拓扑非常相似。
注意:p2pNodes.Get (1)
结点,它是结点容器p2pNodes中的第二个结点,有p2pDevices
和csmaDevices
两个网络设备,是一个双模结点(什么是双模结点?)。
Wi-Fi网络
Wi-Fi无线网络由一个接入点(AccessPoint,AP)和nWifi个移动结点组成。其中AP也是一个双模结点。它安装有PPP和Wi-Fi两个网络设备。
除了WifiNetDevice类,Wi-Fi网络设备还包括链路(WifiMac)层与物理(WifiPhy)层部分。这里的WifiNetDevice只起一个连接上下层协议的桥梁作用,没有什么实质性功能。主要Wifi协议功能都集中在WifiMac和WifiPhy两个基类和其各个子类当中,这个结构一方面可以把一个复杂功能模块化,有利于后续的开发和维护;另一个方面其实更加符合物理网络的层次划分。
这种NetDevice+Mac+Phy的3层网络设备结构在ns-3的无线结点中会经常用到。
设置Channel和WifiPhy
需要用到两个助手类
YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();phy.SetChannel (channel.Create ());WifiHelper wifi;wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
这两个C++类有一些重要参数需要配置,例如WifiChannel需要配置传播延迟和损耗模型。
这两个模型加上最后一步中的移动模型一起决定了一个分组在无线信道中传播延迟和接收功率。
WifiPhy需要配置误码率模型。
设置WifiMac并在结点中安装NetDevice
这一步骤同样需要用到两个助手类WifiMacHelper 和WifiHelper 。
WifiMacHelper
用于设置链路层WifiMAC
类。需要设置两个重要参数:WifiMAC
和服务集标识符SSID
。前者决定了这个结点的种类——AP或移动结点。后者决定了一个结点所属的服务集。AP与移动结点的服务集必须一致才能通信。
WifiHelper wifi;wifi.SetRemoteStationManager ("ns3::AarfWifiManager");WifiMacHelper mac;Ssid ssid = Ssid ("ns-3-ssid");mac.SetType ("ns3::StaWifiMac","Ssid", SsidValue (ssid),"ActiveProbing", BooleanValue (false));
//移动结点NetDeviceContainer staDevices;staDevices = wifi.Install (phy, mac, wifiStaNodes);
//安装移动结点mac.SetType ("ns3::ApWifiMac","Ssid", SsidValue (ssid));
//AP结点NetDeviceContainer apDevices;//安装AP结点apDevices = wifi.Install (phy, mac, wifiApNode);
完成信道和网络设备中各个组件的配置后,就可以使用
助手类WifiHelper
将网络设备安装到指定结点当中了。
本例子中,WifiHelper 还设置了WifiRemoteStationManager
子类类型。WifiRemoteStationManager
主要用于速率控制。
设置移动模型
移动模型是无线网络中一个必不可少的组成部分。
在配置Channel和WifiPhy时,一个分组在Channel中传播延迟和接收功率大小是由传播延迟模型、损耗模型和移动模型共同决定的。
传播延迟和损耗模型已经在前面配置,而移动模型一般在Wifi网络设备安装到结点之后配置。这是因为不同的Wifi结点类型需要采用不同的移动模型。
ns3移动模型使用笛卡尔坐标系标识结点位置。其助手类是MobilityHelper。与设置链路层类似,在Wifi网络中设置移动模型时也需要区分AP与移动结点。
AP结点:固定结点。使用固定位置移动模型ConstantPositionMobilityModel
。这个模型的AP结点坐标是(0,0)。
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");mobility.Install (wifiApNode);
移动结点:移动结点的移动模型设置分为初始位置分布和后续移动轨迹模型。
前者定义了移动结点的初始坐标,GridPositionAllocator
这个分布器是按照设置好的行列参数把结点等间距放在二维坐标系当中。
后者定义了结点的移动路径,移动轨迹模型是RandomWalk2dMobilityModel
在一个指定大小的长方形区域内按随机的速度和方向移动。
MobilityHelper mobility;mobility.SetPositionAllocator ("ns3::GridPositionAllocator","MinX", DoubleValue (0.0),"MinY", DoubleValue (0.0),"DeltaX", DoubleValue (5.0),"DeltaY", DoubleValue (10.0),"GridWidth", UintegerValue (3),"LayoutType", StringValue ("RowFirst"));mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel","Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));mobility.Install (wifiStaNodes);
安装TCP/IP协议簇
InternetStackHelper stack;stack.Install (csmaNodes);stack.Install (wifiApNode);stack.Install (wifiStaNodes);Ipv4AddressHelper address;address.SetBase ("10.1.1.0", "255.255.255.0");Ipv4InterfaceContainer p2pInterfaces;p2pInterfaces = address.Assign (p2pDevices);address.SetBase ("10.1.2.0", "255.255.255.0");Ipv4InterfaceContainer csmaInterfaces;csmaInterfaces = address.Assign (csmaDevices);address.SetBase ("10.1.3.0", "255.255.255.0");address.Assign (staDevices);address.Assign (apDevices);
安装应用程序
UdpEchoServerHelper echoServer (9);ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));serverApps.Start (Seconds (1.0));serverApps.Stop (Seconds (10.0));UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);echoClient.SetAttribute ("MaxPackets", UintegerValue (1));echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));echoClient.SetAttribute ("PacketSize", UintegerValue (1024));ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (nWifi - 1));clientApps.Start (Seconds (2.0));clientApps.Stop (Seconds (10.0));
设置路由
当多个有线网络子网存在通信时,我们在就需要在脚本设置路由协议。例如在前文创建CSMA网络时,曾经提到一个p2pNode.Get(1)
结点。
这个结点有PointToPointNetDevice
和CsmaNetDevice
两个网络设备。分别连接PPP网络和CSMA网络。
在third脚本的地址分配中,这两个网络属于不同的子网。这就需要连接两个子网的p2pNodes.Get(1)
结点具有路由功能,这样才能正确地转发从PPP子网发往CSMA子网的分组。
ns-3有线网络最常用的路由协议之一是全局路由。
全局路由通过开放式最短路径优先(OSPF)路由算法计算有线网络拓扑中每两个结点的最短路径,并为每个结点生成路由表。
对于IPv4协议,全局路由设置一般是通过在脚本中调用助手类Ipv4GlobalRoutingHelper
的PopulateRoutingTables()
函数完成的。
数据追踪
模拟最重要的目的之一就是分析网络性能。
获取实验数据是分析网络性能的重要前提。
if (tracing == true){pointToPoint.EnablePcapAll ("third");phy.EnablePcap ("third", apDevices.Get (0));csma.EnablePcap ("third", csmaDevices.Get (0), true);}
这里的pointTopoint
是一个点对点信道PointToPointHelper
助手类对象。
EnablePcapAll()
函数的作用是手机这个信道上所有结点的链路层分组收发记录。
记录文件的格式是pcap。
third
是文件名的前缀,EnablePcapAll()
函数对文件名的命名规则是“前缀名-<结点标号>-<网络设备号>”,如third-0-0.pcap。
pointToPoint.EnablePcapAll ("third");
可以看到,分组链路类型是PPP,在时间2.008151s时,AP结点的PPP网络设备收到了10.1.3.3无线结点法网10.1.2.4有线结点的一个UDP分组。
phy.EnablePcap ("third", apDevices.Get (0));
这行代码使用的时YansWifiPhyHelper
的Enab1lePcap()
函数打印AP结点中Wi-Fi网络设备的物理层分组收发信息。
通过tcpdump可以看到,AP结点首先发送的时信标帧(Beacon)。接下来,AP结点收到了3个移动结点发来的关联请求帧(Assoc Request)。这些帧的SSID值(ns-3-ssid)都是相同的。
最后下面这行代码记录了一个有线结点中CSMA网络设备的分组收发信息。
csma.EnablePcap ("third", csmaDevices.Get (0), true);
启动与结束
输出结果如下:
总结
在third脚本当中,
在网络拓扑上,我们巩固了PPP网络的创建,学会了CSMA网络的创建,两者都属于有线网络技术。
除此之外,学会构建了Wi-Fi网络,这是无线网络。无线网络需要设置Channel和WifiPhy,设置WifiMac并在结点中安装NetDevice,为结点设置移动模型。
我们初识双模结点,由于无线网络中的AP结点(PPP和Wifi两个网络设备)以及与PPP的第二个结点(PPP和CSMA),都有两个网络设备,故称之为双模结点。
在路由设置过程中,多个有线网络存在通信,就需要设置路由协议,才能正确转发从PPP子网法网CSMA子网的分组。
另外,学会了分析性能的重要功能——数据追踪,运用了函数EnablePcapAll()
,可以收集这个信道上所有结点的链路层分组收发记录。