博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NS3网络仿真(6): 总线型网络
阅读量:6590 次
发布时间:2019-06-24

本文共 3036 字,大约阅读时间需要 10 分钟。

快乐虾

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

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 = 3csmaNodes = 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

# 配置IPaddress = 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))

再执行此脚本:


你可能感兴趣的文章
C/C++获取文件大小
查看>>
深入理解Java内存模型(五)——锁
查看>>
Chalubo僵尸网络来袭 IOT设备或将受到DDoS攻击
查看>>
如何实现百万TPS?详解JMQ4的存储设计
查看>>
这么说吧,NIO很简单,其实就是个牛逼IO
查看>>
使用Python快速获取公众号文章定制电子书(二)
查看>>
iOS下JS与OC互相调用(七)--Cordova 基础
查看>>
Three.js 关于立方体贴图产生边缘锯齿问题
查看>>
Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力
查看>>
【开发问题记录①】关于滑动CollectionView时ContentSize变化的问题
查看>>
java中GC的基本概念
查看>>
building xxx gradle project info的解决办法
查看>>
Vagrant (一) - 基本知识
查看>>
在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境
查看>>
数据结构与算法 | Leetcode 19. Remove Nth Node From End of List
查看>>
一起来读you don't know javascript(一)
查看>>
[LeetCode] 862. Shortest Subarray with Sum at Least K
查看>>
【分享】终端命令工具 自动生成vue组件文件以及修改router.js
查看>>
[LeetCode] Student Attendance Record I
查看>>
PHP回顾之多进程编程
查看>>