NS3 幫助類翻譯

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有一些目的:

  1. src/文件下的其余部分并沒有以來于helper API;任何使用helper API的代碼都可以使用底層的API實現拄轻。
  2. Containers:仿真經常要對一組對象做一系列動作颅围。helper API使得我們對一些對象容器采取相似或者不同的操作。
  3. helper API不是通用的恨搓;它不能最大化代碼復用谷浅。因此,像拓撲機制和模板這樣成功的代碼服用的編程結構在這里是不適用的奶卓。例如,CsmaNetDevice helpers 和 PointToPointNetDevice helpers是分開的撼玄,并不是從NetDevice基類派生出來的夺姑。
  4. 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中惹挟。與之不同的是茄螃,這里會使用寫入磁盤的兩個文件中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末连锯,一起剝皮案震驚了整個濱河市归苍,隨后出現的幾起案子用狱,更是在濱河造成了極大的恐慌,老刑警劉巖拼弃,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夏伊,死亡現場離奇詭異,居然都是意外死亡吻氧,警方通過查閱死者的電腦和手機溺忧,發(fā)現死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盯孙,“玉大人鲁森,你說我怎么就攤上這事≌穸瑁” “怎么了歌溉?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長报账。 經常有香客問我研底,道長,這世上最難降的妖魔是什么透罢? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任榜晦,我火速辦了婚禮,結果婚禮上羽圃,老公的妹妹穿的比我還像新娘乾胶。我一直安慰自己,他們只是感情好朽寞,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布识窿。 她就那樣靜靜地躺著,像睡著了一般脑融。 火紅的嫁衣襯著肌膚如雪喻频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天肘迎,我揣著相機與錄音甥温,去河邊找鬼。 笑死妓布,一個胖子當著我的面吹牛姻蚓,可吹牛的內容都是我干的。 我是一名探鬼主播匣沼,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狰挡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起加叁,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倦沧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后它匕,有當地人在樹林里發(fā)現了一具尸體刀脏,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年超凳,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耀态。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轮傍,死狀恐怖,靈堂內的尸體忽然破棺而出首装,到底是詐尸還是另有隱情创夜,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布仙逻,位于F島的核電站驰吓,受9級特大地震影響,放射性物質發(fā)生泄漏系奉。R本人自食惡果不足惜檬贰,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缺亮。 院中可真熱鬧翁涤,春花似錦、人聲如沸萌踱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽并鸵。三九已至鸳粉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間园担,已是汗流浹背届谈。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粉铐,地道東北人疼约。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蝙泼,于是被迫代替她去往敵國和親程剥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容