NS3中的packet

在NS3中贺奠,分組(packet)由四部分組成:byte buffer荚恶,一組byte tags,一組packet tags功舀,metadata[1]。

byte buffer存儲了經(jīng)過序列化處理(serialize)的分組頭部(headers)和尾部(trailers)身弊。這樣做的目的是讓分組的呈現(xiàn)形式更加符合真實(shí)分組的情況辟汰。

下面介紹序列化處理的概念。序列化處理是serialize的中文翻譯阱佛。在真實(shí)網(wǎng)絡(luò)中帖汞,消息的呈現(xiàn)形式是一串二進(jìn)制0/1序列。而在NS3仿真中凑术,消息以C++數(shù)據(jù)結(jié)構(gòu)(類)的形式出現(xiàn)翩蘸。序列化處理是將數(shù)據(jù)結(jié)構(gòu)形式的消息按照特定的協(xié)議轉(zhuǎn)化為二進(jìn)制序列[3]。

去序列化處理(deserialize)的過程與序列化處理的過程正好相反淮逊,是從二進(jìn)制序列中恢復(fù)消息的數(shù)據(jù)結(jié)構(gòu)催首。

下面以AODV協(xié)議的RREQ消息為例形象的說明序列化處理的過程。在仿真中壮莹,RREQ消息以頭部的形式出現(xiàn)翅帜,通過Packet::AddHeader()方法以序列化的形式被添加進(jìn)分組。

RREQ消息的格式如下[2]:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |J|R|G|D|U|   Reserved          |   Hop Count   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            RREQ ID                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination IP Address                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  Destination Sequence Number                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Originator IP Address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  Originator Sequence Number                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

在NS3中命满,RREQ消息通過類RreqHeader(在文件aodv-packet.h文件中定義)來實(shí)現(xiàn)涝滴,源碼如下:

class RreqHeader : public Header 
{
public:
  /// c-tor
  RreqHeader (uint8_t flags = 0, uint8_t reserved = 0, uint8_t hopCount = 0,
              uint32_t requestID = 0, Ipv4Address dst = Ipv4Address (),
              uint32_t dstSeqNo = 0, Ipv4Address origin = Ipv4Address (),
              uint32_t originSeqNo = 0);
  // Header serialization/deserialization
  static TypeId GetTypeId ();
  TypeId GetInstanceTypeId () const;
  uint32_t GetSerializedSize () const;
  void Serialize (Buffer::Iterator start) const;
  uint32_t Deserialize (Buffer::Iterator start);
  void Print (std::ostream &os) const;
  // Fields

   ......

  // Flags
  ......
  bool operator== (RreqHeader const & o) const;
private:
  uint8_t        m_flags;          ///< |J|R|G|D|U| bit flags, see RFC
  uint8_t        m_reserved;       ///< Not used
  uint8_t        m_hopCount;       ///< Hop Count
  uint32_t       m_requestID;      ///< RREQ ID
  Ipv4Address    m_dst;            ///< Destination IP Address
  uint32_t       m_dstSeqNo;       ///< Destination Sequence Number
  Ipv4Address    m_origin;         ///< Originator IP Address
  uint32_t       m_originSeqNo;    ///< Source Sequence Number
};

注:該類中不包含消息的第一個字節(jié)Type。該字節(jié)單獨(dú)添加。

序列化處理函數(shù)的源碼(在文件aodv-packet.cc中)如下:

void
RreqHeader::Serialize (Buffer::Iterator i) const
{
  i.WriteU8 (m_flags);
  i.WriteU8 (m_reserved);
  i.WriteU8 (m_hopCount);
  i.WriteHtonU32 (m_requestID);
  WriteTo (i, m_dst);
  i.WriteHtonU32 (m_dstSeqNo);
  WriteTo (i, m_origin);
  i.WriteHtonU32 (m_originSeqNo);
}

從源碼中可以看出歼疮,序列化處理是將RREQ消息的各個字段按照協(xié)議規(guī)定的先后次序?qū)懭隑uffer杂抽。
至此,序列化概念介紹完畢韩脏。

tags包含了特定的仿真信息缩麸。由于協(xié)議的頭部和尾部不存在這些信息的字段,因此在byte buffer中不能包含這些信息赡矢,需要使用tags來存放這些信息杭朱。

metadata描述了頭部和尾部的類型(type)。

參考文獻(xiàn):

  1. https://www.nsnam.org/doxygen/classns3_1_1_packet.html
  2. RFC3561
  3. https://www.nsnam.org/doxygen/classns3_1_1_header.html#afb61f1aac69ff8349a6bfe521fab5404
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吹散,一起剝皮案震驚了整個濱河市弧械,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌空民,老刑警劉巖刃唐,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異界轩,居然都是意外死亡画饥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門浊猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖甘,“玉大人,你說我怎么就攤上這事与殃〉ド剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵幅疼,是天一觀的道長。 經(jīng)常有香客問我昼接,道長爽篷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任慢睡,我火速辦了婚禮逐工,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漂辐。我一直安慰自己泪喊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布髓涯。 她就那樣靜靜地躺著袒啼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚓再,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天滑肉,我揣著相機(jī)與錄音,去河邊找鬼摘仅。 笑死靶庙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娃属。 我是一名探鬼主播六荒,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矾端!你這毒婦竟也來了掏击?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤须床,失蹤者是張志新(化名)和其女友劉穎铐料,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豺旬,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钠惩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了族阅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篓跛。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坦刀,靈堂內(nèi)的尸體忽然破棺而出愧沟,到底是詐尸還是另有隱情,我是刑警寧澤鲤遥,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布沐寺,位于F島的核電站,受9級特大地震影響盖奈,放射性物質(zhì)發(fā)生泄漏混坞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一钢坦、第九天 我趴在偏房一處隱蔽的房頂上張望究孕。 院中可真熱鬧,春花似錦爹凹、人聲如沸厨诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽微酬。三九已至绘趋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間得封,已是汗流浹背埋心。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忙上,地道東北人拷呆。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像疫粥,于是被迫代替她去往敵國和親茬斧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容