NDN代码分析(2) tlv编码和cs代码
ndnSIM的data包和interest包的tlv编码、解码过程及如何判断包的类型。
ndnSIM学习(五)——data包和interest包的tlv编码、解码过程以及如何判断包的类型_间宫羽咲sama的博客-CSDN博客_tlv编码规则
首先,ndn对于非负整数的编码规则是按照官网上的Non-Negative Integer Encoding规则进行编码的。
- 如果这个数 ⩽ 252,那么就用1字节表示它本身
- 如果这个数 ⩽ 2^16 ,那么用3字节表示它。其中首字节为 253 ,用于标志长度为 2 ,代表真正表示这个数的是后面 2 字节
- 如果这个数 ⩽ 2^32 ,那么用3字节表示它。其中首字节为 254 ,用于标志长度为 4 ,代表真正表示这个数的是后面 4 字节
- 如果这个数 ⩽ 2^64 ,那么用3字节表示它。其中首字节为 255,用于标志长度为 8 ,代表真正表示这个数的是后面 8 字节
1 | 0 ⇒ 0x00 |
所谓的TLV编码,全名就是 Type(T)-Length(L)-Value(V)
编码。说白了,每个包都被切成 TLV
的格式,前面 Type
代表类型,给大家摘录一段 tlv.hpp
的代码就懂了
1 | namespace tlv { |
注意:T和L都是按照非负整数编码规则编码的!
举个例子:假设 Type=256, Length=65535
,按照非负整数编码规则,这个TLV就应当是 (0xFD0100)(0xFDFFFF)(xxxxxxxxxxxxxx)
,其中加括号只是为了方便读者理解, (xxxxxxxxxxxxxx)
代表65535字节长的包。
xxxxxxx
中包含了数据、签名等各种信息,每种信息都用 tlv
编码进行。或者跟具体地说,最外层的 tlv=(Type=Name)(Length)(V)
的 V
里面
咱们还是拿一具体的例子来说吧。比如data包,假设其中含有 Name+Content+SignatureInfo+SignatureValue
的信息。所以,实际上,这个data包里面真正包含的内容如下图所示:
/4.png)
/5.png)
Face::onReceiveElement
将Block
类型的内容,通过其type
解码判别出它是Interest
类还是Data
类,从而将Block
转化为对应的类型。- 转化为对应类型后,由对应的构造函数执行
wireDecode
函数。 - 每个类的
wireDecode
函数都配备有m_wire.parse()
函数,对Block
类的m_wire
进行参数解析。 - 参数解析方式基于前面的非负整数编码规则、TLV编码和data包和interest包的编码规则的前置知识,对于
Block
类型执行对应的解码。具体不想细讲了,前面已经讲得很细了。
ndnSIM学习(六)——内容缓存CS、cs.cpp、cs.hpp_间宫羽咲sama的博客-CSDN博客
ndnSIM学习(六)——内容缓存CS、cs.cpp、cs.hpp
<ndnSIM-folder>/NFD/daemon/table/cs.hpp
<ndnSIM-folder>/NFD/daemon/table/cs.cpp
<ndnSIM-folder>/NFD/daemon/table/cs-entry.hpp
<ndnSIM-folder>/NFD/daemon/table/cs-entry.cpp
<ndnSIM-folder>/NFD/daemon/table/cs-policy.hpp
<ndnSIM-folder>/NFD/daemon/table/cs-policy.cpp
1 | class Cs : noncopyable //Cs是一个内容缓存类,其父类为noncopyable,缓存内容存在m_table中 |
cs.cpp的Cs::insert函数详解
整个 cs.hpp
都很简单,对应的函数功能我都给了详细注释。对于 cs.cpp
,我只对 Cs::insert
这一个函数进行一些分析说明,具体说明以注释的形式给出——
1 | void |
总结 :
- 类 Cs 就是一个内容缓存器,其中缓存内容都存放在一个 m_table 中。
- m_table 的类型为 Table ,相当于 std::set 。因为是集合,所以禁止存在相同元素。
- std::set 的底层实现用到了红黑树,需要重载 operator < ,所以在文件 cs-entry.cpp 中 Entry 类型重载了 < 符号。
- 缓存策略由 m_policy 进行维护,其中维护了缓存策略和缓存上限。
cs.hpp
的类 Cs
的数据成员如下——
1 | private: |
cs-entry.hpp
的类 Entry
的数据成员如下——
1 | private: |
cs-policy.hpp
的类 Policy
的数据成员如下——
1 | private: |