NS3 Packet类

来源:互联网 发布:linux 启动matlab 编辑:程序博客网 时间:2024/06/17 00:40

关于Packet类的详解和成员函数的介绍:https://www.nsnam.org/docs/release/3.12/doxygen/classns3_1_1_packet.html#details

以下为部分翻译:


Detailed Description


network packets

每个网络包包含一个字节缓冲区,一组字节标签(bytes tags),一组数据包标签(packet tags)和元数据(metadata)。

1、字节缓冲区以序列化内容的形式存储着一个数据包的头和尾。 这些头部的序列化表示被期待和实际网络数据包的位数匹配(尽管没有强制您这样做),这意味着包缓冲区的内容相当于真实数据包的内容。(注:也就是说,字节缓冲区里存储的是packet的头部和尾部)

2、元数据描述了在字节缓冲区中序列化的头部和尾部的类型。 默认情况下,元数据的维护是可选的和禁用的。 要启用它,您必须调用Packet:: EnablePrinting,这将允许您从Packet :: Print和Packet :: Print获取非空输出。如果您只想启用检查元数据,并且不需要任何打印功能,您可以调用Packet :: EnableChecking:其运行时代价低于Packet ::EnablePrinting。

3、该标签集包含不能存储在数据包字节缓冲区中的特定仿真信息,因为协议报头或报尾没有此信息的标准字段。所谓的“字节”标签用于标记分组字节缓冲区中的字节的子集,而“分组”标签用于标记分组本身。这两种标签之间的主要区别是当数据包被复制,分段和重新组合时会发生什么:'byte'标签跟随字节,而'packet'标签跟随数据包。这两种标签之间的另一个重要区别是,字节标签不能被删除,并且预期被写入一次,并且读取多次,而数据包标签预期被写入一次,读取多次,并且完全移除一次。“byte”标签的一个示例是一个FlowIdTag,它包含一个流ID,由应用程序生成流量设置。“分组”标签的示例是由应用设置并由较低级MAC层处理的跨层qos类id。

为新协议实现新类型的头部或者尾部非常简单——创建ns3 :: Headerns3 :: Trailer基类的子类,并实现它们各自的API文档中描述的方法。 

实现一种新类型的Tag需要大致相同的工作量,这个工作在ns3 :: Tag API文档中有描述。

Packet API中讨论了Packet API的性能方面。


Constructor & Destructor Documentation


1、ns3::Packet::Packet()

Createan empty packet with a new uid (as returned by getUid).

创建一个uid标识(由getUid获得)的空包。

2、ns3::Packet::Packet(uint32_t size)

创建一个用零填充有效负载的数据包。 没有分配有效负载所需的内存:如果您尝试对该数据包进行分片或访问零填充字节,它将在任何时间点分配。数据包被分配一个新的uid(由getUid返回)。

参数:size,用0填充的负载的size

3、

ns3::Packet::Packet

(

uint8_t const * 

buffer,

uint32_t 

size,

bool 

magic 

)



从序列化缓冲区创建一个新的数据包。 这个新数据包与缓冲区中包含的序列化数据包相同,并为您神奇地反序列化

参数:

buffer:将要创建的序列化的packet

size:反序列化的包的尺寸

magic:是否允许包反序列化;当设置为false时assert。

4、

ns3::Packet::Packet

(

uint8_t const * 

buffer,

uint32_t 

size 

)



创建一个包含buffer的内容的数据包。复制输入数据:输入缓冲区不变。

参数:

buffer:要存储到包的数据

size:输入buffer的size。


Member Function Documentation


1void ns3::Packet::AddAtEnd

(

Ptr< const Packet > 

packet

)

在当前数据包的末尾连接输入数据包。 这不会改变任何一个数据包的uid。

参数:

packet:要连接在当前包末尾的packet

2、voidns3::Packet::AddByteTag(const Tag & tag)const

参数:

tag:要添加到包的新tag

3、void ns3::Packet::AddHeader(const Header & header)

将头添加到此数据包。 该方法调用Header ::GetSerializedSize和Header :: Serialize方法来在缓冲区中保留空间,并请求头部在数据包缓冲区中对其进行序列化。

4、voidns3::Packet::AddPacketTag(const Tag & tag)const

向此数据包添加标签。 此方法调用Tag ::GetSerializedSize,然后调用Tag :: Serialize。

注意这个方法是const,也就是说,它不会修改这个数据包的状态,这是非常不直观的。


0 0
原创粉丝点击