NS3网络仿真(2):first.py
学习一下ns中的第一个演示样例脚本。first.py。这个演示样例模拟一个Echo服务和client之间的通信。
1.1 导入所须要的库
ns3的每个模块都有一个相应的用C++开发的dll。在python下也有一个相应的模块,使用前必须先导入所须要的模块:
import ns.applications
import ns.core
import ns.internet
import ns.network
import ns.point_to_point
import ns.netanim
1.2 创建节点
NS3中的一个节点代表一台能够加入诸如协议栈,应用以及外设卡等等东西的计算机。
在first.py中使用以下的python语句能够创建我们须要的节点:
nodes= ns.network.NodeContainer()
nodes.Create(2)
这里的NodeContainer提供了一种简便的方式来创建、管理和使用不论什么节点对象,我们用这些节点来运行模拟器。
1.3 构建拓扑
上面的脚本中只创建了所须要的两个节点,但他们所代表的节点什么都没有做。构建拓扑的下一步是把我们的节点连接到一个网络中。
我们所支持的最简单的网络形式是一个在两个节点之间单独的point-to-point连接。我们在此会构建一个此类连接。
pointToPoint= ns.point_to_point.PointToPointHelper()
pointToPoint.SetDeviceAttribute("DataRate",ns.core.StringValue("5Mbps"))
pointToPoint.SetChannelAttribute("Delay",ns.core.StringValue("2ms"))
devices= pointToPoint.Install(nodes)
这里的DataRate和Delay是这个点对点连接的两个属性。
在Install之后能够得到一个NetDeviceContainer对象。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
此时我们得到了两个节点,每个节点安装了点到点网络设备,在它们之间是一个点到点信道。两个设备会被配置在一个有2毫秒传输延时的信道上以5M比特每秒的速率数据传输。
1.4 安装协议栈
我们如今已经配置了节点和设备,可是我们还没有在节点上安装不论什么协议栈。
以下两行代码完毕这个任务:
stack= ns.internet.InternetStackHelper()
stack.Install(nodes)
InternetStackHelper 是一个安装PointToPointHelper对象和点到点网络设备的网络协议栈的拓扑生成器类。当中Install()方法以一个NodeContainer 对象做为一个參数,当它被运行后。它会为每个节点容器中的节点安装一个网络协议栈(TCP,UDP,IP等等)。
1.5 配置IP及MAC
以下我们须要为节点上的设备设置IP地址。
NS3提供了一个拓扑生成器来管理IP地址的分配。当运行实际的地址分配时唯一用户可见的API是设置基IP地址和子网掩码。
以下两行代码:
address= ns.internet.Ipv4AddressHelper()
address.SetBase(ns.network.Ipv4Address("10.1.1.0"),
ns.network.Ipv4Mask("255.255.255.0"))
声明了一个地址生成器对象。而且告诉它应该開始从10.1.1.0開始以子网掩码为255.255.255.0分配地址。地址分配默认是从1開始并单调的增长。所以在这个基础上第一个分配的地址会是10.1.1.1,紧跟着是10.1.1.2等等。
以下一行代码:
interfaces= address.Assign(devices)
完毕了真正的地址配置,此时我们能够得到一个Ipv4Interface对象。
在ns-3中我们使用Ipv4Interface对象将一个IP地址同一个设备关联起来。
正如我们有时候须要一个被生成器创建的网络设备列表一样。我们有时候须要一个Ipv4Interface对象的列表。Ipv4InterfaceContainer提供了这种功能。
如今我们有了一个安装了协议栈,配置了IP地址类的点到点的网络。这时我们所要做的事情是运用它来产生数据通信。
1.6 Echo服务
以下的代码在节点上设置一个UDP 回显服务应用。
echoServer= ns.applications.UdpEchoServerHelper(9)
serverApps= echoServer.Install(nodes.Get(1))
serverApps.Start(ns.core.Seconds(1.0))
serverApps.Stop(ns.core.Seconds(10.0))
上面代码中的第一行构造了一个UdpEchoServerHelper对象。这是一个用来帮助创建真正应用的对象。同其它生成器对象相似。UdpEchoServerHelper对象有一个Install方法。实际上是这种方法的运行。才初始化回显服务器的应用,并将应用连接到一个节点上去。安装会返回一个容器,这个容器中包括了指向全部被生成器创建的应用指针。
应用对象须要一个时间參数来“開始”产生数据通信而且可能在一个可选的时间点“停止”。
我们提供了開始和停止的两个參数。这些时间点是用ApplicationContainer的方法Start和Stop来设置的。
1.7 EchoClient
echoclient应用的设置与回显服务器端相似。
也有一个UdpEchoClientHelper来管理UdpEchoClientApplication。
echoClient= ns.applications.UdpEchoClientHelper(interfaces.GetAddress(1),9)
echoClient.SetAttribute("MaxPackets",ns.core.UintegerValue(2))
echoClient.SetAttribute("Interval",ns.core.TimeValue(ns.core.Seconds(1.0)))
echoClient.SetAttribute("PacketSize",ns.core.UintegerValue(1024))
clientApps= echoClient.Install(nodes.Get(0))
clientApps.Start(ns.core.Seconds(2.0))
clientApps.Stop(ns.core.Seconds(10.0))
对于echoclient,我们须要设置五个不同的属性。
首先两个属性是在UdpEchoClientHelper的构建过程中被设置的。
依照生成器的构造函数的格式,我们把”RemoteAdress”和”RemotePort”属性传递给了生成器(实际上是作为生成器构造函数的两个必须參数传递的)。
回顾一下我们使用Ipv4InterfaceContainer来追踪我们配置给设备的IP地址。
在界面容器中位置零的界面对象将会和在节点容器中的位置零的节点对象相应。相同在界面容器中位置一的界面对象将会和在节点容器中的位置一的节点对象相应。
所以。在上面的第一行代码中,我们创建了一个生成器并告诉它设置client的远端地址为服务器节点的IP地址。我们相同告诉它准备发送第二个数据包到端口9。那个“MaxPackets”属性告诉client我们所同意它在模拟期间所能发送的最大数据包个数。
“Interval”属性告诉client在两个数据包之间要等待多长时间,而“PacketSize”属性告诉client它的数据包应该承载多少数据。本例中,我们让client发送一个1024字节的数据包。
正如echo服务端一样,我们告诉echoclient何时来開始和停止。可是这里我们使client在服务端生效1s后才開始(在模拟器中时间2s的时候)。
1.8 開始仿真
以下我们所须要做的就是运行模拟器,这是用全局函数Simulator.Run.来做到的
ns.core.Simulator.Run()
ns.core.Simulator.Destroy()
当我们调用了例如以下方法时:
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
...
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
实际上我们是在模拟器中1.0秒,2.0秒,和10.0时预设了事件的发生。
当Simulator::Run被调用时,系统会開始遍历预设事件的列表并运行。
首先它会在1.0s时运行事件,这个事件会使echo服务端应用生效(这个事件会预设很多其它的其它事件)。接下来仿真器会运行在t=2.0秒时的事件,即让echoclient应用開始。相同的,这个事件可能会预定很多其它的其它事件。
在echoclient应用中的開始事件的运行会通过给服务端传送一个数据包来開始仿真的数据传送阶段。发送一个数据包给服务端会引发一系列很多其它的事件。这些事件会被预设在此事件之后。并依据我们已经在脚本中设定的时间參数来运行数据包的应答。
事实上,我们只发送了一个数据包。在此之后。那个被单独的client应答请求所引发的连锁反应会停止。而且模拟器会进入空暇状态。
当这发生时。生下来的事件就是服务端和client的Stop事件。
当这些事件被运行后,就没有将来的事件来运行了,函数Simulator::Run会返回。整个模拟过程就结束了。
以下剩下的事情就是清理了。
这个通过调用全局函数Simulator::Destroy来完毕。当生成器函数(或者低级的ns-3代码)被运行后,生成器安排的钩子函数就被插入到模拟器中来销毁全部被创建的对象。你自己并不须要追踪不论什么对象。你所须要做的不过调用Simulator::Destroy而且退出。ns-3系统会帮你料理这些繁杂的任务。
NS3网络仿真(2):first.py的更多相关文章
- NS3网络仿真(6): 总线型网络
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 在NS3提供的第一个演示样例first.py中,模拟了一个点对点的网络,接下来的一个演示样例代码模 ...
- NS3网络仿真(7): Wifi节点
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...
- NS3网络仿真(3): NetAnim
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的演示样例first.py中,并没有生成NetAnim所须要的xml文件,本节我们尝试 ...
- NS3网络仿真(12): ICMPv4协议
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ICMP的全称是 Internet ControlMessage Protocol . 其目的就是 ...
- NS3网络仿真(9): 构建以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3使用了一个叫Packet的类来表示一个数据帧,本节尝试用它构造一个以太网帧. 以下是一个典 ...
- NS3网络仿真(4): DataRate属性
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在first.py中创建了一个点到点的信道,且配置了两个属性: pointToPoint = ns ...
- NS3网络仿真(11): ARP
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ARP(Address ResolutionProtocol,地址解析协议)协议的基本功能就是通过 ...
- NS3网络仿真(5): 数据包分析
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在我们生成的xml文件里.是不包括生成的数据包的数据的,在我们的脚本中加入以下的语句: point ...
- NS3网络仿真(10): 解析以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...
随机推荐
- STL之set篇
insert为插入.set_intersection求交集,set_union求并集,是属于algorithm里的函数. 例题有 PAT甲级1063 #include<iostream> ...
- html5——应用缓存
基本概念 1.HTML5中我们可以轻松的构建一个离线(无网络状态)应用,只需要创建一个cache manifest文件 2.可配置需要缓存的资源,网络无连接应用仍可用,本地读取缓存资源,提升访问速度, ...
- JS——this与new
this: 1.this只出现在函数中 2.谁调用函数,this就指的是谁 3.new People的this指的就是被创建的对象实例 new: 1.开辟内存空间,存储新创建的对象 2.把this设置 ...
- [Windows Server 2012] MySQL安全加固
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:MySQL ...
- [Windows Server 2012] 手工破解MySQL密码
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:破解MySQL ...
- python os os.path模块学习笔记
#!/usr/bin/env python #coding=utf-8 import os #创建目录 os.mkdir(r'C:\Users\Silence\Desktop\python') #删除 ...
- HDU_1063_Exponentiation_大数
Exponentiation Time Limit: 2000/500 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- js常用方法和技巧
随着AJAX的流行,js又得到了很多人的重视,js最大的优势就是它能够对html上的所有元素进行操作,包括创建标签元素,更改元素属性等,这样就使得我们能够利用js来实现很多的动态效果,来提供给用户更强 ...
- Java并发——阿里架构师是如何巧用线程池的!
一.创建线程 1.创建普通对象,只是在JVM的堆里分配一块内存而已 2.创建线程,需要调用操作系统内核的API,然后操作系统需要为线程分配一系列资源,成本很高 线程是一个重量级对象,应该避免频繁创建和 ...
- pandas.DataFrame.rank
原文:https://www.cnblogs.com/sunbigdata/p/7874581.html pandas.DataFrame.rank DataFrame.rank(axis=0 ...