IPv4 addresses assignment
為了在網(wǎng)絡(luò)上使用IPv4,首先要做的是分配IPv4地址。
任何支持IPv4的ns-3節(jié)點都至少有一個NetDevice:ns3 :: LoopbackNetDevice澳淑。 環(huán)回設(shè)備地址是127.0.0.1历等。 所有其他NetDevice將有一個(或多個)IPv4地址鲫趁。
需要注意的是炕桨,和今天一樣饭尝,ns-3沒有NAT模塊,也沒有遵循關(guān)于過濾私有地址(RFC 1918)的規(guī)則:10.0.0.0/8,172.16.0.0/12和192.168.0.0/16献宫。 這些地址被路由為任何其他地址钥平。 這種行為在未來可能會改變。
IPv4全局地址可以是:
- 手動分配
- 通過DHCP分配
ns-3可以同時使用這兩種方法姊途,理解這兩者的含義是相當重要的涉瘾。
Manually assigned IPv4 addresses
這是最簡單也是用的最多的。例子:
Ptr<Node> n0 = CreateObject<Node> ();
Ptr<Node> n1 = CreateObject<Node> ();
NodeContainer net (n0, n1);
CsmaHelper csma;
NetDeviceContainer ndc = csma.Install (net);
NS_LOG_INFO ("Assign IPv4 Addresses.");
Ipv4AddressHelper ipv4;
ipv4.SetBase (Ipv4Address ("192.168.1.0"), NetMask ("/24"));
Ipv4InterfaceContainer ic = ipv4.Assign (ndc);
這種方法會將兩個全局IPv4地址添加到節(jié)點捷兰。
請注意立叛,地址是按順序分配的。 因此贡茅,第一個節(jié)點/網(wǎng)絡(luò)設(shè)備將具有“192.168.1.1”秘蛇,第二個“192.168.1.2”等等。
可以重復(fù)上述操作顶考,將多個地址分配給一個節(jié)點赁还。 但是,由于Ipv4AddressHelper的單例本質(zhì)驹沿,首先應(yīng)該分配一個網(wǎng)絡(luò)的所有地址艘策,然后更改網(wǎng)絡(luò)基礎(chǔ)(SetBase),然后重新分配一個渊季。
或者朋蔫,可以將一個特定的地址分配給一個節(jié)點:
Ptr<Node> n0 = CreateObject<Node> ();
NodeContainer net (n0);
CsmaHelper csma;
NetDeviceContainer ndc = csma.Install (net);
NS_LOG_INFO ("Specifically Assign an IPv4 Address.");
Ipv4AddressHelper ipv4;
Ptr<NetDevice> device = ndc.Get (0);
Ptr<Node> node = device->GetNode ();
Ptr<Ipv4> ipv4proto = node->GetObject<Ipv4> ();
int32_t ifIndex = 0;
ifIndex = ipv4proto->GetInterfaceForDevice (device);
Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("192.168.1.42"), NetMask ("/24"));
ipv4proto->AddAddress (ifIndex, ipv4Addr);
DHCP assigned IPv4 addresses
Tracing in the IPv4 Stack
互聯(lián)網(wǎng)堆棧在其各種協(xié)議實現(xiàn)中提供了許多跟蹤源。 這些跟蹤源可以使用自己的自定義跟蹤代碼來掛鉤却汉,或者在某些情況下可以使用我們的幫助函數(shù)來安排跟蹤啟用驯妄。
ARP提供兩個跟蹤掛鉤,一個在緩存中合砂,一個在三層協(xié)議中富玷。 緩存中的跟蹤訪問者被命名為“Drop”。當數(shù)據(jù)包通過需要ARP的接口傳輸時既穆,首先排隊等待在ARP緩存中傳輸赎懦,直到解析所需的MAC地址。 嘗試獲取地址時可能會進行多次重試幻工,如果超過最大重試次數(shù)励两,則所涉及的數(shù)據(jù)包將被ARP丟棄。 如下情況囊颅,ARP緩存中的第一個跟蹤掛鉤被調(diào)用:
- 如果出站數(shù)據(jù)包放置在ARP高速緩存掛起地址解析中当悔,并且在最大重試次數(shù)內(nèi)不能進行解析傅瞻,則會丟棄出站數(shù)據(jù)包并觸發(fā)此跟蹤;
第二個跟蹤掛鉤在ARP L3協(xié)議(也稱為“Drop”)中,并且可能由于多種原因而被調(diào)用:
- 如果收到一個不等待回復(fù)的條目的ARP應(yīng)答盲憎,則ARP應(yīng)答包被丟棄嗅骄,并且這個跟蹤被觸發(fā);
- 如果收到一個不存在的條目的ARP應(yīng)答,則ARP應(yīng)答包被丟棄饼疙,并且這個跟蹤被觸發(fā);
- 如果ARP高速緩存條目處于DEAD狀態(tài)(超時)并收到ARP應(yīng)答數(shù)據(jù)包溺森,則回復(fù)數(shù)據(jù)包將被丟棄,并觸發(fā)此跟蹤窑眯。
- 每個ARP高速緩存條目都有一個未決數(shù)據(jù)包的隊列屏积。 如果超出隊列的大小,則會丟棄出站數(shù)據(jù)包磅甩,并觸發(fā)此跟蹤炊林。
IPv4三層協(xié)議提供三個跟蹤掛鉤。 這些是“Tx”(ns3 :: Ipv4L3Protocol :: m_txTrace)卷要,“Rx”(ns3 :: Ipv4L3Protocol :: m_rxTrace)和“Drop”(ns3 :: Ipv4L3Protocol :: m_dropTrace)跟蹤源渣聚。
“Tx”跟蹤在許多情況下被觸發(fā),所有這些都表明給定的數(shù)據(jù)包將被發(fā)送到給定的ns3 :: Ipv4Interface:
- 在發(fā)往廣播地址的數(shù)據(jù)包的情況下僧叉,對Ipv4InterfaceList進行迭代奕枝,并且對于每個接口處于啟用狀態(tài)并且可以對數(shù)據(jù)包進行分段或者具有足夠大的MTU來傳輸數(shù)據(jù)包的情況下,跟蹤被命中彪标。 請參閱ns3 :: Ipv4L3Protocol :: Send。
- 在需要路由的數(shù)據(jù)包的情況下掷豺,可以在將分組發(fā)送到適合于默認網(wǎng)關(guān)的接口之前觸發(fā)“Tx”跟蹤捞烟。 請參閱ns3 :: Ipv4L3Protocol :: SendRealOut。
- 同樣在需要路由的分組的情況下当船,“Tx”跟蹤可以在分組被發(fā)送到適合于發(fā)現(xiàn)的路由的輸出接口之前被觸發(fā)题画。 請參閱ns3 :: Ipv4L3Protocol :: SendRealOut。
當數(shù)據(jù)包從設(shè)備傳遞到ns3 :: Ipv4L3Protocol :: Receive函數(shù)時德频,將觸發(fā)“Rx”跟蹤:
- 在接收函數(shù)中苍息,迭代Ipv4InterfaceList,如果接收設(shè)備對應(yīng)的Ipv4Interface處于UP狀態(tài)壹置,則觸發(fā)跟蹤竞思。
丟棄數(shù)據(jù)包的任何情況下(發(fā)送和接收路徑)都會觸發(fā)“Drop”跟蹤:
- 在ns3 :: Ipv4Interface :: Receive函數(shù)中,如果接收設(shè)備對應(yīng)的接口處于DOWN狀態(tài)钞护,則丟棄數(shù)據(jù)包并觸發(fā)丟棄跟蹤盖喷。
- 同樣在ns3 :: Ipv4Interface :: Receive函數(shù)中,如果發(fā)現(xiàn)校驗和不正確难咕,則數(shù)據(jù)包將被丟棄并觸發(fā)放置軌跡课梳。
- 在ns3 :: Ipv4L3Protocol :: Send中距辆,為廣播地址綁定的傳出數(shù)據(jù)包將被丟棄,如果設(shè)置了“不分段”位并且分段可用且需要暮刃,則會觸發(fā)“丟棄”跟蹤跨算。
- 同樣在ns3 :: Ipv4L3Protocol :: Send中,如果分段不可用并且是必需的(MTU <分組大型职谩)诸蚕,則丟棄以廣播地址為目的地的傳出分組并且“丟棄”跟蹤被命中。
- 在廣播地址的情況下灾搏,為每個輸出接口克隆輸出數(shù)據(jù)包挫望。如果任何接口處于DOWN狀態(tài),則“Drop”跟蹤事件將引用復(fù)制的數(shù)據(jù)包狂窑。
- 在需要路由的數(shù)據(jù)包的情況下媳板,如果沒有找到到遠程主機的路由,則丟棄外出數(shù)據(jù)包泉哈,并且觸發(fā)“丟棄”跟蹤事件蛉幸。
- 在ns3 :: Ipv4L3Protocol :: SendRealOut中,丟棄正在路由的傳出數(shù)據(jù)包丛晦,如果設(shè)置了“不分段”位并且分段可用且需要奕纫,則會觸發(fā)“丟棄”跟蹤。
- 在ns3 :: Ipv4L3Protocol :: SendRealOut中烫沙,如果分段不可用并且是必需的(MTU <分組大衅ゲ恪),則將丟棄正在路由的傳出分組锌蓄,并且命中“丟棄”跟蹤升筏。
- 如果所需的Ipv4Interface處于DOWN狀態(tài),將丟棄正在路由的傳出數(shù)據(jù)包瘸爽,并觸發(fā)“Drop”跟蹤事件您访。
- 如果數(shù)據(jù)包正在被轉(zhuǎn)發(fā),并且超過了TTL(請參閱ns3 :: Ipv4L3Protocol :: DoForward)剪决,則數(shù)據(jù)包將被丟棄灵汪,并觸發(fā)“Drop”跟蹤事件。