美文网首页
NS3中的packet

NS3中的packet

作者: smilesimple | 来源:发表于2017-08-28 17:23 被阅读0次

在NS3中,分组(packet)由四部分组成:byte buffer,一组byte tags,一组packet tags,metadata[1]。

byte buffer存储了经过序列化处理(serialize)的分组头部(headers)和尾部(trailers)。这样做的目的是让分组的呈现形式更加符合真实分组的情况。

下面介绍序列化处理的概念。序列化处理是serialize的中文翻译。在真实网络中,消息的呈现形式是一串二进制0/1序列。而在NS3仿真中,消息以C++数据结构(类)的形式出现。序列化处理是将数据结构形式的消息按照特定的协议转化为二进制序列[3]。

去序列化处理(deserialize)的过程与序列化处理的过程正好相反,是从二进制序列中恢复消息的数据结构。

下面以AODV协议的RREQ消息为例形象的说明序列化处理的过程。在仿真中,RREQ消息以头部的形式出现,通过Packet::AddHeader()方法以序列化的形式被添加进分组。

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文件中定义)来实现,源码如下:

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
};

注:该类中不包含消息的第一个字节Type。该字节单独添加。

序列化处理函数的源码(在文件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消息的各个字段按照协议规定的先后次序写入Buffer。
至此,序列化概念介绍完毕。

tags包含了特定的仿真信息。由于协议的头部和尾部不存在这些信息的字段,因此在byte buffer中不能包含这些信息,需要使用tags来存放这些信息。

metadata描述了头部和尾部的类型(type)。

参考文献:

  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

相关文章

  • NS3中的packet

    在NS3中,分组(packet)由四部分组成:byte buffer,一组byte tags,一组packet t...

  • NS3 WiFi环境中Packet从Socket到NetDevi

    从我的另一篇文章:NS3 WiFiNetDevice结构大致可以了解到Packet从NetDevice到物理层之间...

  • NS3 WiFi环境中Socket发送Packet的过程

    前言 这篇文章介绍一下Socket发送Packet的过程。NS3的socket类以及子类,工厂类很多,调用过程复杂...

  • centos7环境下ns3 安装过程

    centos7环境下ns3 安装过程 (1)安装ns3依赖环境 (2)步骤 下载ns3 从https://www....

  • 基于NS3的无线链路物理层仿真实验

    一、实验目的 掌握NS3的基本仿真方法 熟悉NS3的无线链路模型 改进NS3的无线链路模型 二、实验背景 在原有的...

  • NS初学-first.cc

    在ubuntu上安装了ns3后开始使用样例学习使用ns3,ns3使用c++编程还是让我学起来比较爽的

  • ns3仿真demo(third.cc(wifi))

    ns3仿真demo(third.cc) 一. 运行third.cc #include ''ns3/core-mod...

  • NS3 日志使用

    介绍 NS3提供了功能强大的日志系统,利用日志我们可以方便的使用、调试NS3代码。并且NS3的日志系统使用起来也非...

  • NS3学习DAY2

    NS3重要概念 节点 可以理解为英特网中的主机,但因为NS3不是专门模拟英特网的,所以用结点代替。C++用Node...

  • android opensl 播放音频

    一、思路: 在Jni层初始化好OpenSl,解码线程不停地从packet queue中获取packet(这个部分请...

网友评论

      本文标题:NS3中的packet

      本文链接:https://www.haomeiwen.com/subject/mjpgdxtx.html