ns3之PPBP模块的添加与使用
简介:
PPBP(Poisson Pareto Burst Process Primer):
流量生成器遵循Poisson Pareto Burst Process(PPBP)。是一个基于具有重尾分布长度的多个突发流量重叠的过程。此过程中的事件表示无限多用户中的一个开始或停止传输流量突发的时间点。PPBP与M/G/无限队列模型密切相关。在PPBP模型中,突发流量按照泊松过程到达,速率为lambda_p,其长度遵循帕累托分布,其参数是赫斯特指数H(0.5~0.9),以及Ton。每次突发流量由具有恒定比特率r的流建模。然后,在突发流量长度有无限方差的情况下,重叠的突发流量聚合成一个远程依赖流量。
根据Littles定律,活动突发流量的平均数量由下式给出:
E[n] = Ton x lambda_p
由于每个突发流量产生具有恒定比特率的流,因此可以直接计算PPBP的总速率
λ = Ton x lambda_p x r
其中:
lambda_p: mean rate of burst arrivals
Ton: mean burst time length
r: Burst intensity
GitHub地址:https://github.com/sharan-naribole/PPBP-ns3
安装
- 本文按照PPBP官方的安装方法,即安装在applications的内部,使用时只需要包含applications的头文件即可
- 也可以按照NS3官方的方案,安装一个独立的PPBP模块,详情参考 https://www.nsnam.org/docs/manual/html/new-modules.html
1.正确安装ns3
2.添加源码到ns3
- 把PPBP-application.cc 和 PPBP-application.h复制到 /src/applications/model
- 把PPBP-helper.cc 和 PPBP-helper.h复制到 /src/applications/helper
可以利用cp命令,例如:
sudo cp xxx/yyy/PPBP-application.cc /src/applications/model
3.修改配置文件
ns-3.29/src/applications/wscript
在文件合适位置添加以下几行:
'model/PPBP-application.cc',
'helper/PPBP-helper.cc',
'model/PPBP-application.h',
'helper/PPBP-helper.h',
以我的为例:
- 先cd到
ns-3.29/src/applications
文件夹 - 然后
sudo vim wscript
运行
./waf --run scratch/PPBP-application-test
还可以利用命令行参数修改运行的配置,simulationTime为仿真的时间,verbose
./waf --run "scratch/PPBP-application-test --simulationTime=10.0 --verbose=true"
例程分析
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/csma-module.h"
#include "ns3/applications-module.h"
using namespace ns3;
bool verbose = true;
// 定义一个日志组件
NS_LOG_COMPONENT_DEFINE("PPBPExample");
void TxTrace(std::string context, Ptr<const Packet> packet)
{
if (verbose)
{ //LOG_UNCOND-->无条件记录信息 后两行输出当前时间
NS_LOG_UNCOND("Packet transmitted by "
<< context << " Time: "
<< Simulator::Now().GetSeconds());
}
}
void ReceivePacket(Ptr<Socket> socket)
{
while (socket->Recv())
{
if (verbose)
{ //LOG_UNCOND-->无条件记录信息 后两行输出当前时间
NS_LOG_UNCOND("Received one packet at "
<< Simulator::Now().GetSeconds());
}
}
}
int main(int argc, char* argv[])
{
// 设置仿真时间为5秒,可通过命令行参数修改
double simulationTime = 5; //seconds
// 可通过命令行修改simulationTime和verbose两个值
CommandLine cmd;
cmd.AddValue("simulationTime", "Simulation time", simulationTime);
cmd.AddValue("verbose", "Output transmission and reception timestamps", verbose);
cmd.Parse(argc, argv);
//设置时间精度,只能设置一次,因为动态设置对内存需求大,
//因此一旦设置,就会释放内存,如果不设置,使用默认值ns(纳秒)
Time::SetResolution(Time::NS);
//LOG_INFO--->记录程序进展信息
NS_LOG_INFO("Creating Topology");
// 创建节点对象
NodeContainer nodes;
nodes.Create(2);
// 设置csma的传输速率及延迟
CsmaHelper csma;
csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));
csma.SetChannelAttribute("Delay", TimeValue(NanoSeconds(6560)));
// csma节点安装网卡
NetDeviceContainer devices = csma.Install(nodes);
// 安装协议栈
InternetStackHelper stack;
stack.Install(nodes);
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");//从10.1.1.0 开始 以子网掩码为 255.255.255.0 分配地址
Ipv4InterfaceContainer interfaces = address.Assign(devices);// 完成了csma真正的地址配置
uint32_t socketPort = 9; // 端口号
PPBPHelper ppbp = PPBPHelper("ns3::UdpSocketFactory",
InetSocketAddress(interfaces.GetAddress(1), socketPort));// 定义了一个ppbp对象
ApplicationContainer apps = ppbp.Install(nodes.Get(0)); //在csma的0号节点安装ppbp应用
apps.Start(Seconds(0)); // 应用在 0秒开始
apps.Stop(Seconds(simulationTime)); //应用在simulationTime时间结束
Ptr<Socket> recvSink = Socket::CreateSocket(nodes.Get(1), UdpSocketFactory::GetTypeId());
InetSocketAddress local = InetSocketAddress(interfaces.GetAddress(1), socketPort);
recvSink->Bind(local);
recvSink->SetRecvCallback(MakeCallback(&ReceivePacket)); // 设置收到包的回调函数
Simulator::Stop(Seconds(simulationTime));
//Connect函数的用法:
//此函数将尝试查找与输入路径匹配的所有跟踪源,然后将输入回调连接到它们,以使回调在跟踪事件通知时接收到一个额外的上下文字符串。
//第二个参数是回调函数,回调函数的参数根据第一个参数的属性来设置。需要注意的是,第二个参数所设置的回调函数,其第一个参数是string类型的context。
Config::Connect("/NodeList/*/ApplicationList/*/Tx", MakeCallback(&TxTrace));
Simulator::Run(); // 启动模拟器
Simulator::Destroy();
return 0;
}