ns-3的分组Packet
ns-3的分组由header、payload、trailer组成。Packet定义了分组的存储结构,内部维护一个字节数组 Packet::m_buffer,header、payload、trailer存储在这个字节数组中。
- 传输层和网络层的ns-3 Packet Header具有完全相同的存储结构
- Packet使用虚拟payload,ns-3只会记录payload的大小(单位是Byte)而不为其分配内存。
创建
使用Create模板函数,返回指向Packet对象的Ptr
Header和Trailer
Header和Trailer是分组头和分组尾的基类分组尾携带的都是帧检测序列FCS。派生类包括:
- TcpHeader
- Ipv4Header
- WifiMacHeader
- ……
- EthernetTrailer
- LrWpanMacTrailer 低功率广域网络分组尾
- WifiMacTrailer
分组头尾从C++类到字节数组需要通过序列化Serialize()来完成。Header类只负责定义一个通信协议分组头的信息结构,在网络中实际传输的是Packet对象。以TcpHeader为例:
分段和重组
ns-3使用Packet::CreateFragment()
函数进行分段,参数指定起始字节和长度,返回新分段的Ptr;重组通过Packet::AddAtEnd()
完成。
Tag
ns-3分组除了携带header和trailer以外,还可以携带若干tag。例如可以把一些底层协议参数(如跨层QoS设置)存储在应用层Packet的tag列表,当底层协议处理这个Packet的时候就可以读取对应的设置。
Tag有分组tag和字节tag两种:
- 分组tag 分段后,每个分段都将拥有该tag的拷贝
- 字节tag 只属于被添加时分组的所有字节,后续添加的头尾和负载都不拥有该tag