4.Interest table (PIT)
在NFD的PIT表中包含尚未满足的兴趣包和已经满足的兴趣包,被叫做兴趣表更为恰当,但我们任沿用PIT的叫法。
PIT表项
PIT项 (nfd::pit::Entry)代表尚未满足的兴趣包或者是已经满足的兴趣包,当两个兴趣包具有相同的名字和相同选择器Selector时,称两个兴趣包相似。多个相似的兴趣包共用一个PIT项。每一个PIT项有一个兴趣包来标识,兴趣包中除了名字和选择器,其他的字段都是不重要字段。
每一个PIT项包含一个in-record ,out-record集合,两个计时器。
IN-record (nfd::pit::InRecord)代表兴趣包的下游接口,下游接口是指一个请求信息的请求者:兴趣包来自下游,数据包去往下游。
In-record存储:
- 接口的参数
- 从该接口来的最后一个兴趣包的NONCE(from)
- 从该接口来的最后一个兴趣包的到达时间戳
- 最后一个兴趣包
由incoming interest pipeline插入或更新,由兴趣包满足时的incoming data pipeline删除。
当InterestLifeTime耗尽时in-record也失效,当一个PIT的所有in-record失效是该PIT失效。
当至少有一个有效in-record时该PIT被称为"尚未满足pending"。
Out record (nfd::pit::OutRecord)代表兴趣包的上游接口,一个上游接口是一个潜在的内容源,兴趣包转发给上游,数据包则来自上游。
out-record存储:
- 接口的参数
- 到达该接口最后一个兴趣包的nonce(to )
- 该接口发送的最后一个兴趣包的时间戳
- Nacked字段:表示最后一个outgoing兴趣包被NACKED,同时本字段也纪律Nack的原因。
由outgoing interestpipeline插入或更新,有为满足兴趣包被从该接口到达的数据满足时incoming datapipeline删除
当InererstLifeTime失效是out-record失效。
Timer计时器 一个PIT项有两个计时器,用于转发通道forwarding pipeline
- UNsatisfy timer当PIT表项到期是启动
- straggler timer 当PIT表项已经被满足或拒绝,并不再需要环路检测和测量,可以被删除时该计时器启动。
PIT
nfd::pit是一个包含PIT项的表,有<name,selector>元组作为索引,通常支持插入和删除操作,Pit::insert方法首先产看是否有相似的兴趣包,只有当不存在的时候才可以插入。PIT表是不可迭代的应为他不需要FORWARDING 。
DATA Match算法(Pit::findAllDataMatch)用于找出数据包所能满足的所有兴趣包,将数据包作为输入,返回一个可由该数据满足的PIT项的集合。该算法不阐述任何PIT项。
5.Dead Nonce List
该数据结构是PIT的补充用于环路检测。
在2014年8月我们发现了一个由于InterestLifeTime过短的loop检测问题,当一个兴趣包在其INTERESTLIFETIME时间内没有被满足,则在改时间之后删除PIT项,当网络中存在环路,而环路时延大于INTERESTLIFETIME,此时就检测不到环路。
一种简单的应对测试就是尽可能的长时间保存PIT项,但是由于除了nonce之外还有很多其他的东西,内存开销太高,因此dead nonce list 被踢出用于存储PIT中的“dead”nonce。
Dead Nonce List 是NF的全域容器,每一个项存储name,nonce元组,这些项存储一段时间,而在这段时间之后Interest不太可能发生环路会还(loopback)。
结构,语义和用法
名字和序号元组会在out-record删除之前在incoming data pipeline和interest finalize piprline 被插入Dead Nonce List 。在incoming interest pipeline DNL会查询,是否一个具有相同名字和序号的项已经存在,若存在则说明interest是一个looping interest。
在结构上DNL是一个概率数据结构,每一项存储一个64bit的name ,nonce的哈希值,这在很大程度上降低了内存的消耗。同时,有可能存在哈希碰撞,这就不可避免导致错误判断将非loop interest 视为loopinterest。当然这些错误是可恢复的,消费者可以重新发送兴趣包并给以个新的nonc。
容量管理
保存在DNL中的项可以为其配置生存时间,这个生存时间的设置与环路检测效率,内存消耗,出错(哈希碰撞)有关,需要在三者中进行权衡。
更长的生存时间提高了环路检测的效率,但这也意味着更多的数据被存储,从而增加了内存的负担,有更多的包也同时意味着更大的冲突可能,默认的生存时间是6秒。
一种简单的方法是在每一个项山加时间戳。这一方法消耗了更多的内存,考虑到DNL的过来概率数据结构,项的生存时间并不需要很精确。因此我们索引容器作为一个先进先出的查找,通过调整容器的容量来近似的配置生存时间。
静态配置容器容量是不可以行的,因为每一项添加的频率与兴趣包的到达速度有关系,而这一点并不能干被一个操作来估计。因此我们使用一下算法动态的调整容量一预期每一项的生存时间L:
- 在M区间我们添加一个新的项marked到一个容器里,marked没有一个特定的类型,它是一个具有特殊值的项,我们认为哈希计算不可逆,因此有值推算出name,nonce可能性很小。
- 在区间M,计算marked的个数并记录,添加和计数时间应该是连续的。
- 在区间A,查看当前的计数,当容器容量最优时则应该保持L/M的值,若当前计数小于L/M,容量应该下降,反之上升。
此外容量有个上限和下限,以避免内存溢出,确保正确的操作。当容量下降是,过量的项不是一次性清除,而是在未来的添加操作期间驱除到batches.
6.Strategy Chioce Table
该表包含了为每一个名字空间的转发算法(forwarding strategy ),该表是新加到NDN架构中的。理论上,转发算法是一个程序,它支持被存储在FIB 项中,事实上我们发现,将其存储在分开的表中更方便使用,原因有下:
- FIB项来自RIB,它有NFD RIB 核心来管理。存储算法到FIB 项就需要RIB核心创建,更新,清除他们,增加RIB核心的复杂程度;
- FIB项随着最后一个下一跳记录清除,最后一个上游接口失败而删除,然偶尔们并不现失去配置算法;
- RIB 项,FIB项,以及算法配置的粒度不同,将其放在同一个表中舍得继承更复杂。
结构和语义
Strategy Choice entry (nfd::strategy_choice::Entry)包括名字前缀,为名字空间所选则的。转发算法名称。运行期间算法程序实例化的指引也链接到Strategy Choice项。
Strategy Choice Table (nfd::StrategyChoice)是算法选择项的集合–关联名字空间和特定算法。每一个名字空间都只能设置一个算法,但是子名字空间可以用给他么自己的选择。
当前,算法选择表可以有多个可用“install”的算法,故而为了使得任意默认的算法被NFD知道而用于名字空间-算法的链接中每一个算法都应该使用StrategyChoice::install方法,注意每一个installed算法都应该有自己的唯一名字,不然会出错。
为了确保每个名字空间都有一个算法,NFD在初始化时会将ROOT/名字空间插入算法选择表,为该项所选的散发则被称为默认算法,默认算法可以修改,但根项永远不能被删除。
插入(StrategyChoice::insert)用于插入一个算法选择项,或更新已有的一项,而新的项必须被install;
删除(StrategyChoice::erase)用于删除算法选择项,被该项所覆盖的名字空间继承父名字空间的算法,root项不允许被删除;
支持精确匹配操作,算法选择项可以在前向迭代器上进行迭代。
查找有效算法(StrategyChoice::findEffectiveStrategy),用于查找可以用于转发的算法,对于一个名字空间有效的算法可以定义如下:
- 名字空间与该算法明确关联;
- 算法被明确设置为的第一个父命名空间定义的有效算法。
查找有效算法将名字,PIT项,测量项作为输入参数,返回值是转发策略,返回值通常为有效值,应为每一个名字空间都必须有一个算法。
用法
算法选择表的更新通过管理协议。算法选择管理器直接负责算法选择表的更新操作。
算法选择表应该尽量保持稳定,应为算法是本地NFD操作手动选择。
有效算法(strategy)选择算法(algorithm)由forwarding 在incoming interest pipeline,interest unsatisfied pipeline ,incoming data pipeline 中使用,每一个到达的包至少要调用两次。
7.Measuremnets table
forwarding 算法用测量表来存储关于名字前缀的测量数据。算法可以存储任意数据在PIT和测量表中。该表用名字空间进行索引,因此它适用于存储那些鱼名字空间关联的细心,而不仅仅限于兴趣包。
结构
Measurements 项 (nfd::measurements::Entry)包括名字,算法的API用意存储,检索任意数据信息。虽然可以添加一些标准特性,但我们认为每一个算法有她自身独特的需求,因此添加这些标准带来不必要的开销。综上当前的Measurement项不包含保准特性。
measurementsTable(nfd::measurements)是measurements项的集合。Measurements::get方法找到或是插入一个measurements项,参数包括名字,FIB项或PIT项。由于表的结构,使得他通过FIB/PIT项的操作比起使用名字更有效。Measurements::getParent方法查找或是插入一个父名字空间的measurements项。不同于其他的表,该表没有删除操作。取而代之每一个项具有一个生存时间,由此可以在时间过期后自动的删除。算法通过Measurements::extendLifeTime来请求扩展项的生存时间。在检索现有的项时支持精确匹配和最长前缀匹配。
用法
该表只有forwarding strategy 使用,同时他决定了measurements table 的项的多少,介入的频率。一个好的forwarding strategy存储不超过O(log(N))个项,执行不超过O(N)此查找,(N代表进入包的数量加输出包的数量)。
Measurements Accessor 每一个名字空间都有一个Strategy choice ,每一个forwarding 算法允许接入一部分该算法管理的名字空间的Measurements Table。这就由Measuremen Accessor 来完成。