Ns3Packet 学习笔记

Ns3Packet 学习笔记
每个网络数据包包含一个字节缓冲区、一组字节标签、一组数据包标签和元数据。

字节缓冲区存储添加到数据包的报头和尾部的序列化内容。这些报头的串行化表示 期望与真实网络分组逐位匹配(尽管没有什么强迫你这样做),这意味着分组缓冲器的内容反应了真实分组的内容。

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

这组标签包含模拟特定的信息,这些信息不能存储在数据包字节缓冲区中,因为协议头或尾没有符合标准的字段来存储这些信息。所谓的“字节”标签用于标记数据包字节缓冲区中的字节子集,而“数据包”标签用于标记数据包本身。这两种标签的主要区别在于当包被复制、分段和重组时会发生什么:“字节”标签跟在字节后面,“包”标签跟在包后面。这两种标签之间的另一个重要区别是,字节标签不能被移除,并且期望被写入一次,并且被读取多次,而分组标签期望被写入一次,读取多次,并且恰好被移除一次。

为一个新协议实现一个新类型的头或尾是非常容易的,创建ns3::Header或ns3::Trailer基类的子类,并实现它们各自的API文档中描述的方法就可以了。

实现一种新类型的标记需要大致相同的工作量,这项工作在ns3::Tag记应用编程接口文档中有所描述。

class Packet : public SimpleRefCount
{
public:
Packet (); //创新一个新的空数据包
Packet (const Packet &o); //copy数据包o
Packet &operator = (const Packet &o);// 操作符重载,复制数据包

Packet (uint32_t size); //创建一个负载全0的数据包,有效负载所需的内存没有分配:如果您试图对该数据包进行分段或访问零填充字节,它将在以后的任何时候被分配。数据包被分配了一个新的uid(由getUid返回)。size为有效载荷大小

Packet (uint8_t const*buffer, uint32_t size, bool magic); //从序列化缓冲区创建新数据包,(这个新包与包含在缓冲区中的序列化包相同,并且被神奇地反序列化)size为要反序列化的大小
,magic为是否要反序列化

Packet (uint8_t const*buffer, uint32_t size); //创建一个包,用该缓冲区的内容填充有效负载。

Ptr CreateFragment (uint32_t start, uint32_t length) const; //创建一个包含原始数据包片段的新数据包,返回的数据包与该数据包共享相同的uid。start为从数据包开始到要创建的片段开始的偏移量;
lenght为要创建的片段长度;

inline uint32_t GetSize (void) const; // 返回数据包的字节大小(包括零填充的初始有效负载)。

void AddHeader (const Header & header);//给数据包加包头(此方法调用Header::GetSerializedSize和Header::Serialize方法在缓冲区中保留空间,并请求标头在数据包缓冲区中序列化自身。)

uint32_t RemoveHeader (Header &header); //反序列化并从内部缓冲区中移除Header,返回从数据包中删除的字节数。

uint32_t PeekHeader (Header &header) const; //反序列化,但不从内部缓冲区中移除Header,返回从数据包中读取的字节数。

void AddTrailer (const Trailer &trailer);//给数据包加包尾,(此方法调用Tariler::GetSerializedSize和Tariler::Serialize方法在缓冲区中保留空间,并请求尾部在数据包缓冲区中序列化自身。)

uint32_t RemoveTrailer (Trailer &trailer); //反序列化并从内部缓冲区中移除包尾

uint32_t PeekTrailer (Trailer &trailer); //反序列化

void AddAtEnd (Ptr packet); //在当前数据包的末尾连接输入数据包。

void AddPaddingAtEnd (uint32_t size); //向数据包中添加零填充

void RemoveAtEnd (uint32_t size); // 从当前数据包的末尾删除size字节

void RemoveAtStart (uint32_t size); //从当前数据包的开头删除size字节

uint32_t CopyData (uint8_t *buffer, uint32_t size) const; //将数据包内容复制到字节缓冲区,返回从数据包中读取的字节数

void CopyData (std::ostream *os, uint32_t size) const;//将数据包内容复制到输出流中

Ptr Copy (void) const;// COW 复制,返回包的行为就像原始包的独立副本,即使它们在内部共享相同的数据集。

uint64_t GetUid (void) const;//返回数据包的Uid,当一个包被创建为空的或者有效载荷被填充为零时,它被分配一个新的uid。注意:这个uid是一个内部uid,不能依靠它来得出数据包的数量。如果用户想要跟踪实际的分组计数,应该查看例如IP标识字段或传输序列号,或者其他协议层的其他分组或帧计数器。

void Print (std::ostream &os) const;//打印数据包内容

std::string ToString (void) const; //返回数据包的字符串表示形式,若没有调用EnablePrinting (),会返回一个空字符串

PacketMetadata::ItemIterator BeginItem (void) const;//返回一个迭代器,该迭代器指向存储在该缓冲区中的第一个“item”。请注意,如果您之前没有调用EnablePrinting或者 EnableChecking,这个迭代器将指向一个空的项目数组

static void EnablePrinting (void); //启用打印数据包元数据
默认情况下,数据包没有保留足够的元数据来执行打印方法请求的操作。如果您希望能够使用Packet::Print方法,您需要在模拟设置期间和创建任何数据包之前调用该方法至少一次。

static void EnableChecking (void);//启用数据包元数据检查
当对包执行操作时,包元数据还用于在运行时执行广泛的健全性检查。例如,此元数据用于验证当您从数据包中删除一个报头时,该报头实际上出现在数据包的前端。这些错误将被检测到,并将中止程序。

uint32_t GetSerializedSize (void) const;//返回数据包序列化所需的字节数

uint32_t Serialize (uint8_t* buffer, uint32_t maxSize) const; //将数据包、标签和元数据序列化到字节缓冲区中;maxSize为用于边界检查的缓冲区的最大大小,返回1表示序列化成功,0表示buffer size太小

void AddByteTag (const Tag &tag) const;// 这个包中包含的每个字节都有一个新的字节标签
请注意,添加标签是一个非常不直观的常量操作。其基本原理是,当一个标签被添加到包中时,包的内容和行为是不变的:如果添加了新的标签,任何不知道新标签的代码都将一样工作。添加标签成为const操作的真正原因是,即使数据包是const的,也允许跟踪接收器对数据包进行标记

ByteTagIterator GetByteTagIterator (void) const;// 返回这个包中包含的字节标签集合的迭代器

bool FindFirstMatchingByteTag (Tag &tag) const; //查找与参数标记类型匹配的第一个标记

void RemoveAllByteTags (void);//删除该数据包中存储的所有字节标签

void PrintByteTags (std::ostream &os) const; //迭代此数据包中存在的字节标签,并调用数据包中存储的每个标签的打印方法。

void AddPacketTag (const Tag &tag) const;//添加一个包标签,同样是const操作

bool RemovePacketTag (Tag &tag);//删除一个包标签

bool ReplacePacketTag (Tag & tag); //替换数据包标签的值,tag为要替换的Tag,若没有找到就添加一个Tag

bool PeekPacketTag (Tag &tag) const;//搜索匹配的标记,如果找到,则调用Tag::Deserialize

void RemoveAllPacketTags (void);//删除该数据包中存储的所有包标签

void PrintPacketTags (std::ostream &os) const;//打印包标签列表

PacketTagIterator GetPacketTagIterator (void) const;//返回一个对象,该对象可用于遍历数据包标签列表

private:

Packet (const Buffer &buffer, const ByteTagList &byteTagList,
const PacketTagList &packetTagList, const PacketMetadata &metadata);//构造函数

uint32_t Deserialize (uint8_t const*buffer, uint32_t size);//序列化

Buffer m_buffer;//实际储存数据和包头包尾
ByteTagList m_byteTagList;// ByteTag List
PacketTagList m_packetTagList;// PacketTagList
PacketMetadata m_metadata;// 元信息
Ptr m_nixVector; //数据包的nix vector

}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值