NS3笔记

本文介绍了NS3模拟器中用于无线通信的传播模型,如ConstantSpeedPropagationDelayModel和LogDistancePropagationLossModel,并列举了多种传播损耗和延迟模型。此外,还讨论了不同的速率控制算法,如AarfWifiManager和MinstrelWifiManager,以及物理层的误码率模型NistErrorRateModel。
摘要由CSDN通过智能技术生成

1. 传播模型

ns-3传播模块定义了两个通用接口,即PropagationLossModel和PropagationDelayModel,分别对传播损耗和传播延迟进行建模。

官方文档

https://www.nsnam.org/docs/models/html/propagation.html

NS3信道设置几种写法

-------------------------------- 写法一 --------------------------------

YansWifiPhyHelper wifiPhy;
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());

**默认延迟**:ns3::ConstantSpeedPropagationDelayModel
**默认损耗**:ns3::LogDistancePropagationLossModel
-------------------------------- 写法二 --------------------------------
#include "ns3/propagation-loss-model.h"
#include "ns3/propagation-delay-model.h"

YansWifiPhyHelper wifiPhy;

Ptr<LogDistancePropagationLossModel> lossModel = CreateObject<LogDistancePropagationLossModel> ();
Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();

Ptr<YansWifiChannel> wifiChannel = CreateObject <YansWifiChannel> ();
wifiChannel->SetPropagationLossModel (lossModel);
wifiChannel->SetPropagationDelayModel (delayModel);

wifiPhy.SetChannel (wifiChannel);

-------------------------------- 写法三 --------------------------------

YansWifiPhyHelper wifiPhy;

YansWifiChannelHelper wifiChannel;
wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
wifiChannel.AddPropagationLoss("ns3::LogDistancePropagationLossModel");

wifiPhy.SetChannel(wifiChannel.Create());

1.1 信号传播延迟模型(PropagationDelayModel)

  • ConstantSpeedPropagationDelayModel
       在这个模型中,信号以恒定的速度传播。延迟是根据发射器和接收器的位置来计算的。使用Tx和Rx天线之间的欧几里得距离。注意,根据这个模型,地球是平的。
  • RandomPropagationDelayModel
       传播延迟是完全随机的,每次调用模型时都会发生变化。所有的数据包(甚至是两个固定节点之间的数据包)都经历了随机延迟。因此,数据包的顺序没有得到保留。

1.2 信号传播损失模型(PropagationLossModel)

Propagation Loss Model用来确定接收机能够接收到的信号强度。

模型说明用法
Cost231PropagationLossModel
FixedRssLossModel固定信号强度,只要信号强度RSS设置为大于某个阈值,无论节点间距离多远,都可以通信。wifiChannel.AddPropagationLoss(“ns3::FixedRssLossModel”, “Rss”,DoubleValue(rss))【参考: examples/wireless/wifi-simple-adhoc.cc】
FriisPropagationLossModel
ItuR1411LosPropagationLossModel此类实现 ITU-R 1411 LOS 传播模型,用于 300 MHz 至 100 GHz 频率范围内的视距 (LoS) 短距离户外通信。
ItuR1411NlosOverRooftopPropagationLossModel
JakesPropagationLossModel
Kun2600MhzPropagationLossModel
LogDistancePropagationLossModel对数距离传播模型。该模型使用所谓的对数距离传播模型计算接收功率: $ L = L_0 + 10 n log_{10}(\frac{d}{d_0})$
MatrixPropagationLossModel每对节点的传播损耗是固定的,不取决于它们的实际位置。
NakagamiPropagationLossModel
OkumuraHataPropagationLossModel
RandomPropagationLossModel传播损耗遵循随机分布
RangePropagationLossModel在MaxRange(默认250米)以内无路径损耗,超出该范围损耗无穷大wifiChannel.AddPropagationLoss(“ns3::RangePropagationLossModel”, “MaxRange”, DoubleValue(100))
ThreeLogDistancePropagationLossModel具有三个距离场的对数距离路径损耗传播模型 该模型与 ns3::LogDistancePropagationLossModel 相同,只是它具有三个距离场:近、中和远,具有不同的指数。
TwoRayGroundPropagationLossModel
ThreeGppPropagationLossModel
ThreeGppRMaPropagationLossModel
ThreeGppUMaPropagationLossModel
ThreeGppUmiStreetCanyonPropagationLossModel
ThreeGppIndoorOfficePropagationLossModel

2. 速率控制算法(简介)

  • ArfWifiManager

  • AarfWifiManager(简单略)

  • CaraWifiManager

  • IdealWifiManager
      相当于RBAR算法。

  • RraaWifiManager

  • AmrrWifiManager
       AMRR使用二进制指数退避(BEB)技术来适应用于改变速率和传输计数参数值的采样周期的长度(阈值)。 它使用探测包,并根据其传输状态自适应地改变阈值。 适应机制通过不由倒退机制指定的更高速率来确保更少的故障传输/重传和更高的吞吐量。 除此之外,AMRR采用启发式方法,通过明智地设置速率和传输计数参数来捕获信道的短期变化。

  • OnoeWifiManager
      Onoe是基于信用的RCA,其中信用值根据成功发送的数量和在确定的采样周期上积累的错误传输和重传的数量来确定。 对于以特定速率的成功传输,Onoe不断提高其信用额度,达到某些阈值时,当前的传输速率将提高到下一个更高的速率。 类似地,对于失败的传输/重传,当信用低于某个阈值时,信用被扣除并且传输速率下降到下一个较低的速率。 由于其运行方式,Onoe在速率选择方面保守,对单个数据包故障较不敏感。

  • MinstrelWifiManager
      该算法是源于madwifi 工程的速率控制算法。它是当前LInux内核默认的速率控制算法。Minstrel跟踪每个成功发送可用速率帧的概率。然后通过乘以速率的概率计算期望的吞吐量。这种方法被选择用于确保不会选择最低速率而趋向于最高速率(尽管最低速率具有更高发送成功概率)。

  • ConstantRateWifiManager
      该算法对每一个包使用相同的传输模式。用户可以设置对于所有“unicast”包的期望的“DataMode”和所有“request”控制包的“ControlMode”(例如RTS)。
    控制响应帧(比如CTS,ACK)的传输参数的选择规则在802.11标准中是相当清晰的。ns3遵从了这样的标准和从一系列正常速率或者强制性速率选择作为控制响应帧的速率的选择性。这就意味着,即使ConstantRateWifiManager被使用,控制响应帧也可能使用不同的速率进行发送。
    ConstantRateWifiManager的ControlMode属性仅仅别用与RTS帧。CTS和ACK帧的速率是根据802.11标准进行选择的。然而,用户仍然可以手动添加WifiMode到基本的速率中,这将允许控制响应帧以其他的速率进行发送。请参考project wiki进一步了解这是如何实现的。

3. 误码率模型

  物理层设备(基类 ns3::WifiPhy )在 ns3 中是与 ns3::WifiChannel 相连接的。我们需要为 YansWifiChannel 创建合适的 WifiPhy 对象。这里 YansWifiPhyHelper 就可以胜任这个工作。
YansWifiPhyHelper 类配置了一个对象工厂来创建一个 YansWifiPhy 实例,并添加一些其他的对象到该实例中,包括可能补充的 ErrorRateModel 误码率模型和指向 MobilityModel 移动模型的指针。典型的用户代码如下

YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
wifiPhyHelper.SetChannel (wifiChannel);

YansWifiPhyHelper 默认配置 NistErrorRateModel(ns3::NistErrorRateModel) 误码率模型。你可以使用 YansWifiPhyHelper::SetErrorRateModel 方法更改误码率模型。

好的,这里我提供一个基于ns-3的Propagation Loss Models传播模型性能仿真的代码示例,其中使用了Log-Distance Path Loss Model传播模型。 ```c++ #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/mobility-module.h" #include "ns3/wifi-module.h" #include "ns3/internet-module.h" #include "ns3/applications-module.h" #include "ns3/netanim-module.h" #include "ns3/flow-monitor-module.h" #include "ns3/propagation-loss-model.h" #include "ns3/log-distance-propagation-loss-model.h" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("WifiPropagationLoss"); int main (int argc, char *argv[]) { LogComponentEnable ("WifiPropagationLoss", LOG_LEVEL_INFO); // Create nodes NodeContainer nodes; nodes.Create (2); // Create mobility model MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (5.0), "DeltaY", DoubleValue (5.0), "GridWidth", UintegerValue (3), "LayoutType", StringValue ("RowFirst")); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (nodes); // Create propagation loss model Ptr<LogDistancePropagationLossModel> loss = CreateObject<LogDistancePropagationLossModel> (); loss->SetReference (1.0); // reference distance loss->SetExponent (2.0); // path loss exponent loss->SetFrequency (2.4e9); // signal frequency // Create wifi devices and install them to the nodes WifiHelper wifi; wifi.SetStandard (WIFI_PHY_STANDARD_80211b); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("DsssRate1Mbps"), "ControlMode", StringValue ("DsssRate1Mbps")); WifiMacHelper mac; mac.SetType ("ns3::AdhocWifiMac"); NetDeviceContainer devices = wifi.Install (mac, nodes); devices.Get (0)->GetObject<WifiNetDevice> ()->SetPropagationLossModel (loss); devices.Get (1)->GetObject<WifiNetDevice> ()->SetPropagationLossModel (loss); // Install internet stack InternetStackHelper stack; stack.Install (nodes); // Assign IP addresses Ipv4AddressHelper address; address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = address.Assign (devices); // Create UDP echo server UdpEchoServerHelper echoServer (9); ApplicationContainer serverApps = echoServer.Install (nodes.Get (1)); serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0)); // Create UDP echo client and send packets UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (10)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps = echoClient.Install (nodes.Get (0)); clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0)); // Enable pcap tracing wifi.EnablePcapAll ("wifi-propagation-loss"); // Create animation AnimationInterface anim ("wifi-propagation-loss.xml"); anim.SetConstantPosition (nodes.Get (0), 1.0, 1.0); anim.SetConstantPosition (nodes.Get (1), 2.0, 2.0); // Enable flow monitor Ptr<FlowMonitor> flowMonitor; FlowMonitorHelper flowHelper; flowMonitor = flowHelper.InstallAll (); // Run simulation Simulator::Stop (Seconds (11.0)); Simulator::Run (); // Print flow monitor statistics flowMonitor->CheckForLostPackets (); Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowHelper.GetClassifier ()); std::map<FlowId, FlowMonitor::FlowStats> stats = flowMonitor->GetFlowStats (); for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i) { Ipv4FlowClassifier::FiveTuple tuple = classifier->FindFlow (i->first); NS_LOG_INFO ("Flow " << i->first << " (" << tuple.sourceAddress << " -> " << tuple.destinationAddress << ")"); NS_LOG_INFO (" Tx Bytes: " << i->second.txBytes); NS_LOG_INFO (" Tx Packets: " << i->second.txPackets); NS_LOG_INFO (" Rx Bytes: " << i->second.rxBytes); NS_LOG_INFO (" Rx Packets: " << i->second.rxPackets); NS_LOG_INFO (" Throughput: " << i->second.rxBytes * 8.0 / (i->second.timeLastRxPacket.GetSeconds () - i->second.timeFirstTxPacket.GetSeconds ()) / 1024 / 1024 << " Mbps"); } // Cleanup Simulator::Destroy (); return 0; } ``` 以上代码中,我们创建了两个节点,并在节点上安装了Wifi设备和传播模型。然后我们创建了一个UDP echo server和一个UDP echo client,并在仿真过程中发送了10个数据包。同时,我们使用了NetAnim工具生成了一个动画,并使用FlowMonitor统计了网络吞吐量等性能指标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值