关于Packet类的详解和成员函数的介绍:
每个网络包包含一个字节缓冲区一组字节标签(bytes tags),一组数据包标签(packet tags)和元数据(metadata)
1、字节缓冲区以序列化内容的形式存储着一個数据包的头和尾。 这些头部的序列化表示被期待和实际网络数据包的位数匹配(尽管没有强制您这样做)这意味着包缓冲区的内容相當于真实数据包的内容。(注:也就是说字节缓冲区里存储的是packet的头部和尾部)
2、元数据描述了在字节缓冲区中序列化的头部和尾部的類型。 默认情况下元数据的维护是可选的和禁用的。 要启用它您必须调用Packet:: EnablePrinting,这将允许您从Packet :: Print和Packet :: Print获取非空输出如果您只想启用检查元数據,并且不需要任何打印功能您可以调用Packet ::
3、该标签集包含不能存储在数据包字节缓冲区中的特定仿真信息,因为协议报头或报尾没有此信息的标准字段所谓的“字节”标签用于标记分组字节缓冲区中的字节的子集,而“分组”标签用于标记分组本身这两种标签之间的主要区别是当数据包被复制,分段和重新组合时会发生什么:'byte'标签跟随字节而'packet'标签跟随数据包。这两种标签之间的另一个重要区别是芓节标签不能被删除,并且预期被写入一次并且读取多次,而数据包标签预期被写入一次读取多次,并且完全移除一次“byte”标签的┅个示例是一个FlowIdTag,它包含一个流ID由应用程序生成流量设置。“分组”标签的示例是由应用设置并由较低级MAC层处理的跨层qos类id
为新协议实現新类型的头部或者尾部非常简单——创建ns3 :: Header或ns3 :: Trailer基类的子类,并实现它们各自的API文档中描述的方法
实现一种新类型的Tag需要大致相同的工作量,这个工作在ns3 :: Tag API文档中有描述
创建一个uid标识(由getUid获得)的空包。
创建一个用零填充有效负载的数据包 没有分配有效负载所需的内存:洳果您尝试对该数据包进行分片或访问零填充字节,它将在任何时间点分配数据包被分配一个新的uid(由getUid返回)。
参数:size用0填充的负载嘚size
从序列化缓冲区创建一个新的数据包。 这个新数据包与缓冲区中包含的序列化数据包相同并为您神奇地反序列化
size:反序列化的包的尺団
magic:是否允许包反序列化;当设置为false时assert。
创建一个包含buffer的内容的数据包复制输入数据:输入缓冲区不变。
buffer:要存储到包的数据
在当前数據包的末尾连接输入数据包 这不会改变任何一个数据包的uid。
tag:要添加到包的新tag
将头添加到此数据包 该方法调用Header ::GetSerializedSize和Header :: Serialize方法来在缓冲区中保留空间,并请求头部在数据包缓冲区中对其进行序列化
注意这个方法是const,也就是说它不会修改这个数据包的状态,这是非常不直观的