logo资料库

ns-3 吞吐量;抖动率等参量;网络仿真 时延;.docx

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
NS-3网络仿真
一:实验要求
二:软件介绍
三:实验原理及步骤*
四:实验总结
NS-3网络仿真 一:实验要求 用 NS-3仿真某个特定的网络环境,并输出相应的仿真参数(时延,抖动率,吞吐量,丢 包率)。 二:软件介绍 NS-3 是一款全新新的网络模拟器,NS-3并不是 NS-2的扩展。虽然二者都由 C++编写的, 但是 NS-3并不支持 NS-2的 API。NS-2的一些模块已经被移植到了 NS-3。在 NS-3开发过程时, “NS-3项目”会继续维护 NS-2,同时也会研究从 NS-2到 NS-3的过渡和整合机制。 三:实验原理及步骤* NS-3是一款离散事件网络模拟驱动器,操作者能够编辑自己所需要的网络拓扑以及网络 环境,来模拟一个网络的数据传输,并输出其性能参数。 软件中包含很多模块:节点模块(创造节点),移动模块(仿真 WIFI,LTE 可使用), 随机模块(生成随机错误模型),网络模块(不同的通信协议),应用模块(创建 packet 数 据包以及接受 packet 数据包),统计模块(输出统计数据,网络性能参数)等等; 首先假设一个简单的网络拓扑:两个节点之间使用点对点链路,使用 TCP 协议进行通信, 假设随机错误率为0.00001,节点不可移动(因为不是无线网络),具体代码如下: NodeContainer nodes; nodes.Create (2); 创建两个节点; PointToPointHelper pointToPoint; pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms")); 设置链路的传输速率为5Mbps,时延为2ms;
NetDeviceContainer devices; devices = pointToPoint.Install (nodes); 为每个节点添加网络设备 Ptrem=CreateObject (); em->SetAttribute("ErrorRate",DoubleValue(0.00001)); devices.Get(1)->SetAttribute("ReceiveErrorModel",PointerValue (em)); 创建一个错误模型,讲错误率设置为0.00001,仿真 TCP 协议的重传机制。 InternetStackHelper stack; stack.Install (nodes); 为每个节点安装协议栈; Ipv4AddressHelper address; address.SetBase ("10.1.1.0", "255.255.255.252"); Ipv4InterfaceContainer interfaces = address.Assign (devices); 为每个节点的网络设备添加 IP 地址; 这样一个简单的网络拓扑就建立完成。 接下来就是为这个网络节点添加应用程序,让他们在这个网络中模拟传输数据,具体代 码如下: uint16_t sinkPort = 8080; Address sinkAddress (InetSocketAddress (interfaces.GetAddress (1), sinkPort)); PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), sinkPort)); ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (1)); sinkApps.Start (Seconds (0.)); sinkApps.Stop (Seconds (10.)); 将接受数据的应用程序设置在 Node.Get(1)节点上,端口设置为8080;程序起始时间为0s, 终止时间为10s; Ptr app = CreateObject (); app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps")); nodes.Get (0)->AddApplication (app); app->SetStartTime (Seconds (1.)); app->SetStopTime (Seconds (10.));
将发送数据的应用程序设置在 Node.Get(0);发送起始时间为1s;结束时间为10s; 这样网络拓扑和节点之间应用程序的设定已完成,接下来就是应用统计模块,输出节点 之间具体通信性能的参数,及时延,吞吐量,抖动率,丢包率; NS-3中,有一个回调机制,方便我们来输出具体某个条件发生改变时就自动执行某个函 数,回调的实现是 TraceConnectWithoutContext 函数,举个例子,在我的时延仿真中,输出 时延的代码我是这样写的: static void CalculateDelay (Ptrp,const Address &address) { static float k = 0; k++; static float m = -1; static float n = 0; n += (p->GetUid() - m)/2-1; delayJitter.RecordRx(p); Time t = delayJitter.GetLastDelay(); std::cout << Simulator::Now ().GetSeconds () << "\t" << t.GetMilliSeconds() << std::endl; m = p->GetUid(); } 首先定义一个时延的计算函数,是全局变量函数; 其次在 main 函数中使用回调机制: sinkApps.Get(0)->TraceConnectWithoutContext("Rx", MakeCallback(&CalculateDelay)); 含义就是当接受端节点每收到一个 TCP 包,就会执行一次 CalculateDelay 函数,计算这 个数据包在网络中传输的时延,并输出; 这样就完成了程序的编写;接下来就是输出具体数据: 在终端打开,到指定的文件夹中,输入 ./waf --run scratch/delay >delay.dat 2>&1 按指定格式输出.dat 文件之后,再在终端用 GNUPLOT 来作出.dat 文件中的图形即可:
下面用同样的拓扑,应用程序以及同样的错误模型仿真输出 TCP 拥塞窗口值随时间的变 化,抖动率,丢包率,吞吐量: 拥塞窗口随时间的变化:
丢包率 抖动率
吞吐量 在仿真结果中我们可以看到:当网络传输出现差错传输,导致链路拥塞,使得拥塞窗口 值陡然降低,致使链路的时延变大,抖动率变化也比较明显,吞路量也变小。 下面进行 WIFI 环境下的网络吞吐量的仿真: 拓扑的建立和之前的建立方式大同小异,主要是 WIFI 多了移动模型的添加,为一个节点 添加移动模型的代码如下: MobilityHelper mobility1; mobility1.SetPositionAllocator ("ns3::RandomDiscPositionAllocator", "X", StringValue ("0.0"), "Y", StringValue ("0.0"), "Rho", StringValue ("ns3::UniformRandomVariable[Min=0|Max=20]")); mobility1.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Mode",StringValue ("Time"), "Time",StringValue ("2s"), "Speed",StringValue
("ns3::ConstantRandomVariable[Constant=100]"), "Bounds", RectangleValue (Rectangle (-100, 100, -100, 100))); mobility1.Install (wifiStaNodes.Get (0)); 这样这个节点就能够随机移动,仿真 WIFI 下用户随机移动的特点; 仿真的拓扑图如下: 由于节点的移动导致离 AP 节点的距离不同,因此信道是不断变化的,所以吞吐量也是不 断变化的,再次情况下仿真出来的吞吐量如下:
由此可见:链路的吞吐量没有点对点链路那么平整,变化稍微大一点; 四:实验总结 经过这次实验,我体会到其实不管做什么事,只要坚持,并且冷静去寻找解决问题的途 径,就能解决所有问题。这次实验实际来说给的时间并不多,两星期不到,我一开始选择了 第四个题目,一个全新的东西,一开始看书,什么都看不明白,不过幸好用的语言是 c++, 这是唯一幸运的东西。另外 NS-3要求在 linux 系统下运行,我就赶紧找 linux 安装教程,之 前用过虚拟机,但是特别卡。之后关于 NS-3的安装,挺顺利,没有什么差错。接下来就是 NS-3 软件的学习了,由于 NS-3比较新,国内的教材很少,但在网上搜索的时候,发现基本没有人 看教材,都在看官方文档,于是我就找到了解决这个问题的途径。一边从简单的例子着手, 一边去官方文档中,对照的计算机网络的知识去解释 NS-3中的各个模块的作用,含义。由于 NS-3中没有直接描述吞吐量,时延,丢包率以及抖动率的函数或实例,我只好对照着这些参 数的原始公式来自己写函数,输出这些性能参数。这样一点一滴的积累学习最终完成实验。
分享到:
收藏