ns3网络仿真复习课程Word格式.docx
- 文档编号:17764165
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:9
- 大小:87.05KB
ns3网络仿真复习课程Word格式.docx
《ns3网络仿真复习课程Word格式.docx》由会员分享,可在线阅读,更多相关《ns3网络仿真复习课程Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
节点模块(创造节点),移动模块(仿真WIFI,LTE可使用),
随机模块(生成随机错误模型),网络模块(不同的通信协议),应用模块(创建packet数据包以及接受packet数据包),统计模块(输出统计数据,网络性能参数)等等;
首先假设一个简单的网络拓扑:
两个节点之间使用点对点链路,使用TCP协议进行通信,假设随机错误率为0.00001,节点不可移动(因为不是无线网络),具体代码如下:
NodeContainernodes;
nodes.Create
(2);
创建两个节点;
PointToPointHelperpointToPoint;
pointToPoint.SetDeviceAttribute("
DataRate"
StringValue("
5Mbps"
));
pointToPoint.SetChannelAttribute("
Delay"
2ms"
设置链路的传输速率为5Mbps,时延为2ms;
NetDeviceContainerdevices;
devices=pointToPoint.Install(nodes);
为每个节点添加网络设备
Ptr<
RateErrorModel>
em=CreateObject<
();
em->
SetAttribute("
ErrorRate"
DoubleValue(0.00001));
devices.Get
(1)->
ReceiveErrorModel"
PointerValue(em));
创建一个错误模型,讲错误率设置为0.00001,仿真TCP协议的重传机制。
InternetStackHelperstack;
stack.Install(nodes);
为每个节点安装协议栈;
Ipv4AddressHelperaddress;
address.SetBase("
10.1.1.0"
"
255.255.255.252"
);
Ipv4InterfaceContainerinterfaces=address.Assign(devices);
为每个节点的网络设备添加IP地址;
这样一个简单的网络拓扑就建立完成。
接下来就是为这个网络节点添加应用程序,让他们在这个网络中模拟传输数据,具体代码如下:
uint16_tsinkPort=8080;
AddresssinkAddress(InetSocketAddress(interfaces.GetAddress
(1),sinkPort));
PacketSinkHelperpacketSinkHelper("
ns3:
:
TcpSocketFactory"
InetSocketAddress(Ipv4Address:
GetAny(),sinkPort));
ApplicationContainersinkApps=packetSinkHelper.Install(nodes.Get
(1));
sinkApps.Start(Seconds(0.));
sinkApps.Stop(Seconds(10.));
将接受数据的应用程序设置在Node.Get
(1)节点上,端口设置为8080;
程序起始时间为0s,终止时间为10s;
MyApp>
app=CreateObject<
app->
Setup(ns3TcpSocket,sinkAddress,1040,1000,DataRate("
1Mbps"
nodes.Get(0)->
AddApplication(app);
SetStartTime(Seconds(1.));
SetStopTime(Seconds(10.));
将发送数据的应用程序设置在Node.Get(0);
发送起始时间为1s;
结束时间为10s;
这样网络拓扑和节点之间应用程序的设定已完成,接下来就是应用统计模块,输出节点之间具体通信性能的参数,及时延,吞吐量,抖动率,丢包率;
NS-3中,有一个回调机制,方便我们来输出具体某个条件发生改变时就自动执行某个函数,回调的实现是TraceConnectWithoutContext函数,举个例子,在我的时延仿真中,输出时延的代码我是这样写的:
staticvoid
CalculateDelay(Ptr<
constPacket>
p,constAddress&
address)
{
staticfloatk=0;
k++;
staticfloatm=-1;
staticfloatn=0;
n+=(p->
GetUid()-m)/2-1;
delayJitter.RecordRx(p);
Timet=delayJitter.GetLastDelay();
std:
cout<
<
Simulator:
Now().GetSeconds()<
"
\t"
<
t.GetMilliSeconds()<
endl;
m=p->
GetUid();
}
首先定义一个时延的计算函数,是全局变量函数;
其次在main函数中使用回调机制:
sinkApps.Get(0)->
TraceConnectWithoutContext("
Rx"
MakeCallback(&
CalculateDelay));
含义就是当接受端节点每收到一个TCP包,就会执行一次CalculateDelay函数,计算这个数据包在网络中传输的时延,并输出;
这样就完成了程序的编写;
接下来就是输出具体数据:
在终端打开,到指定的文件夹中,输入
./waf--runscratch/delay>
delay.dat2>
&
1
按指定格式输出.dat文件之后,再在终端用GNUPLOT来作出.dat文件中的图形即可:
下面用同样的拓扑,应用程序以及同样的错误模型仿真输出TCP拥塞窗口值随时间的变化,抖动率,丢包率,吞吐量:
拥塞窗口随时间的变化:
丢包率
抖动率
吞吐量
在仿真结果中我们可以看到:
当网络传输出现差错传输,导致链路拥塞,使得拥塞窗口值陡然降低,致使链路的时延变大,抖动率变化也比较明显,吞路量也变小。
下面进行WIFI环境下的网络吞吐量的仿真:
拓扑的建立和之前的建立方式大同小异,主要是WIFI多了移动模型的添加,为一个节点添加移动模型的代码如下:
MobilityHelpermobility1;
mobility1.SetPositionAllocator("
RandomDiscPositionAllocator"
X"
0.0"
),
Y"
Rho"
StringValue("
UniformRandomVariable[Min=0|Max=20]"
mobility1.SetMobilityModel("
RandomWalk2dMobilityModel"
Mode"
StringValue("
Time"
2s"
Speed"
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中没有直接描述吞吐量,时延,丢包率以及抖动率的函数或实例,我只好对照着这些参数的原始公式来自己写函数,输出这些性能参数。
这样一点一滴的积累学习最终完成实验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ns3 网络 仿真 复习 课程