NS3网络仿真(6): 总线型网络

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息

在NS3提供的第一个示例first.py中,模拟了一个点对点的网络,接下来的一个示例代码模拟了一个总线型网络及CSMA协议。

# // Default Network Topology
# //
# //       10.1.1.0
# // n0 -------------- n1   n2   n3   n4
# //    point-to-point  |    |    |    |
# //                    ================
# //                      LAN 10.1.2.0

只不过NS3提供的示例代码是C++的,我们用Python改写它。

和first.py一样,我们先构造n0-n1之间的点对点连接:

# 构建点对点连接
p2pNodes = ns.network.NodeContainer()
p2pNodes.Create (2)

pointToPoint = ns.point_to_point.PointToPointHelper()
pointToPoint.SetDeviceAttribute ("DataRate", ns.core.StringValue ("5Mbps"))
pointToPoint.SetChannelAttribute ("Delay", ns.core.StringValue ("2ms"))
p2pDevices = pointToPoint.Install (p2pNodes)

再构造n1-n4之间的总线型连接:

# 构建总线连接
nCsma = 3

csmaNodes = ns.network.NodeContainer()
csmaNodes.Add (p2pNodes.Get (1))
csmaNodes.Create (nCsma)

csma = ns.csma.CsmaHelper()
csma.SetChannelAttribute ("DataRate", ns.core.StringValue ("100Mbps"))
csma.SetChannelAttribute ("Delay", ns.core.TimeValue (ns.core.NanoSeconds (6560)))
csmaDevices = csma.Install (csmaNodes)

接下来为每个节点安装协议栈,这里需要注意的是每个节点只能安装一次,这也是这里使用p2pNodes.Get(0)的原因:

# 安装协议栈
stack = ns.internet.InternetStackHelper()
stack.Install (p2pNodes.Get(0))
stack.Install (csmaNodes)

接下来为每个节点配置IP:

# 配置IP
address = ns.internet.Ipv4AddressHelper()
address.SetBase (
    ns.network.Ipv4Address("10.1.1.0"),
    ns.network.Ipv4Mask("255.255.255.0"))
p2pInterfaces = address.Assign (p2pDevices)

address.SetBase (
    ns.network.Ipv4Address("10.1.2.0"),
    ns.network.Ipv4Mask("255.255.255.0"))
csmaInterfaces = address.Assign (csmaDevices)

接着配置要模拟运行的Echo服务和客户端:

# 配置应用程序
echoServer = ns.applications.UdpEchoServerHelper (9)

serverApps = echoServer.Install (csmaNodes.Get (nCsma))
serverApps.Start (ns.core.Seconds (1.0))
serverApps.Stop (ns.core.Seconds (20.0))

echoClient = ns.applications.UdpEchoClientHelper (csmaInterfaces.GetAddress (nCsma), 9)
echoClient.SetAttribute ("MaxPackets", ns.core.UintegerValue (5))
echoClient.SetAttribute ("Interval", ns.core.TimeValue (ns.core.Seconds (1.0)))
echoClient.SetAttribute ("PacketSize", ns.core.UintegerValue (1024))

clientApps = echoClient.Install (p2pNodes.Get (0))
clientApps.Start (ns.core.Seconds (2.0))
clientApps.Stop (ns.core.Seconds (20.0))

由于我们使用了两个网段,因而需要配置路由:

# 全局路由管理器根据节点产生 的链路通告为每个节点建立路由表
ns.internet.Ipv4GlobalRoutingHelper.PopulateRoutingTables()

此后我们就可以开始仿真了:

# 开始仿真
ns.core.Simulator.Run()
ns.core.Simulator.Destroy()

此时我们的脚本还没有任何输出,我们让NS3生成可以在NetAnim中使用的xml文件,在run前添加下面的脚本:

anim = ns.netanim.AnimationInterface(‘second.xml‘)
anim.SetConstantPosition(p2pNodes.Get(0), 10, 10)
anim.SetConstantPosition(csmaNodes.Get(0), 30, 10)
anim.SetConstantPosition(csmaNodes.Get(1), 40, 10)
anim.SetConstantPosition(csmaNodes.Get(2), 50, 10)
anim.SetConstantPosition(csmaNodes.Get(3), 60, 10)

运行此脚本后可以在项目路径下生成second.xml文件,在NetAnim下打开:

再让NS3保存模拟的数据包:

pointToPoint.EnablePcapAll ("second");
csma.EnablePcap ("second", csmaDevices.Get (1), True)

用etherreal打开生成的pcap文件,有点问题:

生成的数据包校验错误,校验码全为0。这是由于NS3没有打开Checksum的缘故,在脚本中加上一行:

ns.core.GlobalValue.Bind("ChecksumEnabled",ns.core.BooleanValue (True))

再运行此脚本:

??

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 16:01:29

NS3网络仿真(6): 总线型网络的相关文章

NS3网络仿真(7): Wifi节点

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中,我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP,再连上几个节点.这也是NS3中的示例third.cc干的事情,只是我们用Python实现. // Default Network Topology // // Wifi 10.1.3.0 // AP // * * * * // | | | | 10.1.1.0 // n5 n6 n7 n0 -----------

NS2网络仿真的过程

NS2网络仿真的过程可以总结为: 1.初始化 创建ns simulator 创建.tr文件(记录仿真结果) 创建.nam文件(记录仿真过程) 设置结束函数 设置仿真中所需的参数 2.创建仿真拓扑 创建节点 创建并设置链路 设置链路各链路在nam中的排列方式 3.创建流量 探测流量:向网络中添加的额外流量,通过对这些流量进行统计分析可以获得端到端性能参数,在ns2中可以通过设置CBR.UDP.TCP等形式的流量实现. 背景流量:用于模拟网络中已经存在的流量,可以有TCP.UDP.短时TCP等多种形

网络仿真中的有限状态机(FSM)

最近在看<OMNET++ User Mannul>,了解到了有限状态机的工作机制.相比早之前看过的<OPNET xxx>教材中讲解FSM不明不白,<OMENT++ User Mannul>讲解的更为清晰简洁,且有偏底层的代码做实例,更易理解. FSM是指完成模块功能的一种手法(例如OMNET++中的模块功能可选择是否由FSM完成),下文的FSM均指模块中的FSM. 构成FSM的主体为状态(State)和状态跳转(State Transition),其中状态分为两种:1)

ofomnet工程调试 之 大型网络仿真不能有C++内存溢出

C++内存溢出是大型网络仿真绕不过的阻碍! 解决方案: 遇到这种问题并不可怕,首先看看当前仿真中的数据包数量是不是巨大,是则去找找每个数据包在哪个模块逗留,改对应的代码即可.如果不是这个问题,那就构造一个简单的网络, 用inet中的模块替换你自己写的模块,以此找出问题模块,然后改吧. 故事简介: 今天发现交换机在为查询流表时新建了match结构体却没有删除,剪切代码如下, void Open_Flow_Processing::processQueuedMsg(cMessage *data_msg

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

网络编程01---计算机网络基础

1.为什么要学习网络编程 1.在移动互联网时代,移动应用的特征有 几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 2.移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐:QQ音乐.百度音乐.酷狗音乐.酷我音乐 LBS:百度地图

Linux网络管理2---(网络环境查看命令、网络测试命令)

1.网络环境查看命令 ifconfig命令 查看或临时修改网络状态的命令 可以看到IP.子网掩码……信息 关闭和启动网卡 ifdown 网卡设备名(比如: ifdown eth0):禁用该网卡设备 ifup 网卡设备名:启用该网卡设备 查询网络状态:netstat 选项: -t:列出TCP 协议端口 -u:列出UDP协议端口 -n:不使用域名与服务名,而使用IP地址和端口号 -l:仅列出在监听状态网络服务(所有UDP服务都没有监听状态,因为TCP是三次握手,需要等待反馈信息,而UDP就不需要)

PGM:贝叶斯网络与朴素贝叶斯网络

http://blog.csdn.net/pipisorry/article/details/51471222 贝叶斯与频率派思想 频率派思想 长久以来,人们对一件事情发生或不发生,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且事情发生或不发生的概率虽然未知,但最起码是一个确定的值. 比如如果问那时的人们一个问题:"有一个袋子,里面装着若干个白球和黑球,请问从袋子中取得白球的概率是多少?"他们会立马告诉你,取出白球的概率就是

网络虚拟化之FlowVisor:网络虚拟层(下)

在前面两篇文章:网络虚拟化之FlowVisor:网络虚拟层(上)和网络虚拟化之FlowVisor:网络虚拟层(中)中分别介绍了FLowVisor的特性和实现,三连载的最后一篇介绍虚拟网络的隔离机制. 虚拟化的一个重要元素是切片之间的隔离,因为不同资源的隔离机制是不相同的,接下来将分别描述. 1. 带宽隔离 FLowVisor可以通过标记数据包的VLAN优先级比特位来利用现存的交换机带宽隔离特性.VLAN标签拥有三个比特域,PCP(VLAN Priority Code Point)有一个将数据包映