ns3-manual.pdf 1.14節(jié)
上面的章節(jié)中介紹了ns3的一些重要的編程的概念救军。例如财异,保存引用計數方便內存管理的智能指針(smart pointers),屬性(attributes)唱遭,命名空間(namespaces)戳寸,回調(callbacks)等。用戶可以使用這些底層的API進行更好的粒度的編程拷泽。然而疫鹊,完全是用這些底層的API編寫仿真程序將會是耗時且無聊的∷局拢基于這個原因拆吆,在ns3的core包中提供了helper API。如果你閱讀了ns-3 tutorial脂矫,你將會熟悉這些helper API枣耀。這些api在文件的開始就已經向用戶進行了介紹。如果你感到困難庭再,你不妨回過頭去向前看這些APIs捞奕。
helper API有一些目的:
- src/文件下的其余部分并沒有以來于helper API;任何使用helper API的代碼都可以使用底層的API實現拄轻。
- Containers:仿真經常要對一組對象做一系列動作颅围。helper API使得我們對一些對象容器采取相似或者不同的操作。
- helper API不是通用的恨搓;它不能最大化代碼復用谷浅。因此,像拓撲機制和模板這樣成功的代碼服用的編程結構在這里是不適用的奶卓。例如,CsmaNetDevice helpers 和 PointToPointNetDevice helpers是分開的撼玄,并不是從NetDevice基類派生出來的夺姑。
- helper API典型用在棧分配(stack-allocated vs heap-allocated)對象空間。對于某些程序掌猛,用戶不用了解底層對象的創(chuàng)建和處理盏浙;用戶可以使用對象容器和棧分配helpers來處理眉睹。
helper API使得ns-3編程簡單書寫和閱讀,不用花費精力在底層的接口上废膘。章節(jié)的其他部分會提供helper API的代碼實例說明helper API的方便之處竹海。
ns-3-tutorial.pdf 4.15節(jié) Topology Helpers
CONCEPTUAL OVERVIEW
4.15節(jié) Topology Helpers
在現實網絡中,你會發(fā)現主機被添加或者創(chuàng)建在NICs( network interface controller)中丐黄。在ns3中你可能會這么處理斋配,找到node,并依附于NetDevices灌闺。在一個大型的網絡仿真中艰争,你需要安排許多在Nodes,NetDevices和Channels之間的連接桂对。
由于連接NetDevices到Nodes甩卓,NetDevices到Channels,需要分配IP地址等蕉斜,這些工作在ns-3中是普遍的任務逾柿,因此我們提供了topology helpers來幫助我們,使得盡可能簡單的幫助處理這些任務宅此。例如机错,創(chuàng)建NetDevice,添加MAC地址诽凌,安裝到一些Node的NetDevice上毡熏,配置node的協(xié)議棧,然后連接NetDevice到Channel等需要使用許多不同的ns-3 core包中的操作侣诵。甚至痢法,許多操作需要連接不同的設備到不同的信道,然后連接個人網到因特網等杜顺。我們提供topology helper對象結合這些不同的操作财搁,抽象成簡單的模型,方便用戶躬络。
ns-3-tutorial.pdf 8.3 GnuplotHelper
8.3 GnuplotHelper
在ns3中尖奔,GnuplotHelper致力于盡量少的代碼產生gnuplot圖。它與ns3的trace source掛鉤穷当,trace source保存數據收集系統(tǒng)支持的數據類型提茁。并不是所有的ns3 trace source的數據類型都是支持的。但是許多常見的數據類型例如 TraceValues with plain old data(POD)類型都是支持的馁菜。
看看這個helper類輸出的文件:
seventh-packet-byte-count.dat
seventh-packet-byte-count.plt
seventh-packet-byte-count.sh
第一個文件是以空格分割的格式化文件茴扁,包含時間戳和包的字節(jié)數。
第二個文件是gnuplot plot文件汪疮,可以用gnuplot打開峭火。知道gnuplot的用戶應該懂得毁习,gnuplot打開上面的文件之后會生成一個sever-packet-byte-count.png文件。
第三個腳本文件會運行這個plot文件生成PNG文件卖丸,可以使用圖片閱讀器打開纺且。命令如下:
sh seventh-packet-byte-count.sh
將會生成一個sever-packet-byte-count.png文件。
為什么不首先就生成這個png文件呢稍浆?
答案是载碌,通過提供這個plt文件,用戶可以在生成PNG文件前粹湃,手動配置預期的結果恐仑。
這個PNG文件的標題是“Packet Byte Count vs. Time”,探測數據來自trace source path:
/NodeList/*/$ns3::Ipv6L3Protocol/Tx
NOTE:注意路徑中的通配符为鳄∩哑停總之,這個plot所捕獲的packet字節(jié)來自Ipv6L3Protocol對象所傳輸的trace source孤钦,一方是大的596字節(jié)的TCP分片歧斟,另一個是60字節(jié)的TCP ack。(兩個節(jié)點的trace sources匹配在同一個trace source)偏形。
這是如何配置的呢静袖?一些狀態(tài)已經被設置,首先俊扭,GnuplotHelper必須聲明和配置:
// Use GnuplotHelper to plot the packet byte count over time
GnuplotHelper plotHelper;
// Configure the plot. The first argument is the file name prefix
// for the output files generated. The second, third, and fourth
// arguments are, respectively, the plot title, x-axis, and y-axis labels
plotHelper.ConfigurePlot ("seventh-packet-byte-count",
"Packet Byte Count vs. Time",
"Time (Seconds)",
"Packet Byte Count");
對于這一點队橙,一個空的plot應該被配置。文件明前綴是第一個參數萨惑。
第二個參數是plot標題捐康。
x-axis(x軸)標簽是第三個參數,
y-axis(y軸)標簽是第四個參數庸蔼。
下一步是配置數據解总,也就是在這里trace source被掛鉤。首先姐仅,注意上面我們所生明的變量花枫,稍候我們會用到:
std::string probeType;
std::string tracePath;
probeType = "ns3::Ipv6PacketProbe";
tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";
我們在這里使用它們:
// Specify the probe type, trace source path (in configuration namespace), and
// probe output trace source ("OutputBytes") to plot. The fourth argument
// specifies the name of the data series label on the plot. The last
// argument formats the plot by specifying where the key should be placed.
plotHelper.PlotProbe (probeType,
tracePath,
"OutputBytes",
"Packet Byte Count",
GnuplotAggregator::KEY_BELOW);
第一個參數是probe type的名字,
第二個參數是trace source path掏膏。
當你嘗試使用該框架時劳翰,這兩個參數應該是最難決定的。這里的探測軌跡(trace probe)是Ipv6L3Protocol的Tx trace source馒疹。當我們查看這個類的實現代碼(src/internet/model/ipv6-l3-protocol.cc)是會發(fā)現下面的代碼:
.AddTraceSource ("Tx", "Send IPv6 packet to outgoing interface.",
MakeTraceSourceAccessor (&Ipv6L3Protocol::m_txTrace))
這就表明Tx是變量m_txTrace的名字磕道,該變量有如下的聲明:
/**
* \brief Callback to trace TX (transmission) packets.
*/
TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_txTrace;
這表明了具體的trace source 簽名是被Ipv6PacketProbe類的Probe類所支持的。參見文件:src/internet/model/ipv6-packet-probe.{h,cc}.
因此行冰,在PlotProbe的上面的聲明中溺蕉,我們了解到trace source與ns3中的Ipv6PacketProbe的Probe類型掛鉤。如果我們不支持這個probe 類型(也就是trace source的簽名)悼做,我們就不能使用(盡管一些復雜的底層的聲明可以被使用疯特,正如手冊中描述的那樣)。
Ipv6PacketProbe輸出包括它自己在內的trace source肛走,以提出探測的包對象的數據:
TypeId
Ipv6PacketProbe::GetTypeId ()
{
static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
.SetParent<Probe> ()
.SetGroupName ("Stats")
.AddConstructor<Ipv6PacketProbe> ()
.AddTraceSource ( "Output",
"The packet plus its IPv6 object and interface that serve as the output for thi
MakeTraceSourceAccessor (&Ipv6PacketProbe::m_output))
.AddTraceSource ( "OutputBytes",
"The number of bytes in the packet",
MakeTraceSourceAccessor (&Ipv6PacketProbe::m_outputBytes))
;
return tid;
}
plotHelper.PlotProbe (probeType,
tracePath,
"OutputBytes",
"Packet Byte Count",
GnuplotAggregator::KEY_BELOW);
這幾句代碼的第三個參數是包的字節(jié)數的聲明漓雅,特別的,“OutputBytes”就是Ipv6PacketProbe的trace source朽色。最后邻吞,第四個參數是數據序列的所表達的意思的說明,第五個參數是gnuplot中的一些標簽在底部顯示葫男。其他可選的有:NO_KEY, KEY_INSIDE, 和 KEY_ABOVE抱冷。
8.4 Supported Trace Types(所支持的軌跡類型)
下面就是Probe所支持的軌跡值類型(traced values):
TracedValue type Probe type File
double DoubleProbe stats/model/double-probe.h
uint8_t Uinteger8Probe stats/model/uinteger-8-probe.h
uint16_t Uinteger16Probe stats/model/uinteger-16-probe.h
uint32_t Uinteger32Probe stats/model/uinteger-32-probe.h
bool BooleanProbe stats/model/uinteger-16-probe.h
ns3::Time TimeProbe stats/model/time-probe.h
下面是Probes所支持的TraceSource 類型:
TracedSource type Probe type Probe outputs File
Ptr<const Packet> PacketProbe Output-Bytes network/utils/packet-probe.h
Ptr<const Packet>, Ipv4PacketProbe Output-Bytes internet/model/ipv4-packet-probe.h
Ptr<Ipv4>, uint32_t
Ptr<const Packet>, Ipv6PacketProbe Output-Bytes internet/model/ipv6-packet-probe.h
Ptr<Ipv6>, uint32_t
Ptr<const Packet>, Ipv6PacketProbe Output-Bytes internet/model/ipv6-packet-probe.h
Ptr<Ipv6>, uint32_t
Ptr<const Packet>, ApplicationPack-etProbe Output-Bytes applications/model/application-packet-probe.h
const Address&
正如我們所看到的,只有一些軌跡源(trace source)是支持的梢褐。它們都導向到輸出字節(jié)的大小旺遮。然而,大多基礎的數據類型如TracedValues是被這些helper類所支持的盈咳。
ns-3-tutorial.pdf 8.5 FileHelper
8.5 FileHelper
FileHelper類是GnuplotHelper類的變異耿眉。例子程序提供了時間戳數據的格式化輸出,如下:
Time (Seconds) = 9.312e+00 Packet Byte Count = 596
Time (Seconds) = 9.312e+00 Packet Byte Count = 564
提供了兩個文件鱼响,一個是節(jié)點0鸣剪,一個是節(jié)點1,這從文件命名就可以看出丈积。下面從代碼中一行行看:
// Use FileHelper to write out the packet byte count over time
FileHelper fileHelper;
// Configure the file to be written, and the formatting of output data.
fileHelper.ConfigureFile ("seventh-packet-byte-count",
FileAggregator::FORMATTED);
文件命名的前綴是第一個參數筐骇,特定的格式是第二個參數。其他的像SPACE_SEPARATED(空格), COMMA_SEPARATED(逗號), and TAB_SEPARATED(制表符)分割的格式是可選的桶癣。用戶可以像下面的代碼一樣來控制格式化:
// Set the labels for this formatted output file.
fileHelper.Set2dFormat ("Time (Seconds) = %.3e\tPacket Byte Count = %.0f");
最后拥褂,用戶所感興趣的跟蹤信息(trace source)一定要掛鉤。在這個例子中的probeType and tracePath倆個變量是使用的牙寞,探測的輸出trace source “OutputBytes”是掛鉤的饺鹃。(翻譯之后,不知道說的什么间雀,直接粘貼以下:Finally, the trace source of interest must be hooked. Again, the probeType and tracePath variables in this example are
used, and the probe’s output trace source “OutputBytes” is hooked:)
// Specify the probe type, trace source path (in configuration namespace), and
// probe output trace source ("OutputBytes") to write.
fileHelper.WriteProbe (probeType,
tracePath,
"OutputBytes");
在tarce source中的通配符會匹配兩個trace sources悔详。在GnuplotHelper中,兩個數據會加載在同一個plot中惹挟。與之不同的是茄螃,這里會使用寫入磁盤的兩個文件中。