NFD的Forwarding模块

Forwarding

NFD中的包处理包括本节所述的转发管道和本节所述的转发策略。转发管道(或管道)是一系列步骤操作包或PIT条目,这是由一个特定事件触发:接收兴趣包,收到兴趣包循环检测,当一个兴趣包准备通过face转发时等等。转发策略是关于兴趣转发的决策者,它附加在管道的末尾或开头。换句话说,该策略决定是否、何时和在何处转发某个兴趣包,而管道则为该策略提供利益和支持信息以进行这些决策。图9显示了转发管道和策略的总体工作流,其中蓝色框表示管道,白色框表示策略的决策点。
在这里插入图片描述
管道对网络层包(兴趣包、数据包或Nack包)进行操作,每个包从一个管道传递到另一个管道(在某些情况下通过策略决策点),直到所有处理完成。管道内的处理使用CS、PIT、dedad Nonce列表、FIB、网络区域表和StrategyChoice表,但是后三个管道只有只读访问权限(它们由相应的管理器管理,不直接受数据平面流量的影响)。FaceTable在NFD中跟踪所有的活动face。它是一个入口点,从这里传入的网络层数据包被发送给转发管道进行处理。管道也允许通过face发送数据包。NDN中兴趣包、数据包和Nack包的处理是完全不同的。我们将转发管道分为兴趣包处理路径、数据包处理路径和Nack处理路径,以下部分将对此进行描述。

兴趣包处理路径

NFD将兴趣处理过程分为下面几个管道:

  • 进去兴趣包:处理来的兴趣包
  • 兴趣包循环:处理循环的兴趣包
  • 错过的CS:处理未被缓存数据满足的兴趣包
  • CS命中:处理的已经被满足缓存数据的兴趣包
  • 出去的兴趣包:准备和发出的兴趣包
  • 兴趣包拒绝:处理被策略拒绝的PIT条目
  • 兴趣未满足:处理下游数据过期前未被满足的PIT条目
  • 兴趣包完成:删除PIT条目

1. incoming Interest
传入兴趣管道在Forwarder::onIncomingInterest方法中实现,并从Forwarder::startProcessInterest方法中输入,该方法由Face:: afterReceiveInterest信号触发。传入利息管道的输入参数包括新接收的利息包和对接收该利息包的面的引用。该管道包括以下步骤,如图所示:
在这里插入图片描述
step 1:检查/localhost。通常来说从non-local进入的兴趣包一般应该具有/localhost开头的名字,如果检测到违法LOCALhost则立即丢弃该兴趣包,将在后面执行dropped Interest。这一步用于防范恶意发送者;
step 2:比对兴趣包的Name ,Nonce与dead nonce list。若有相同项则怀疑所接收兴趣包为环路兴趣包,将他交给Interestloop 管道进一步处理;
step 3:使用该兴趣包中的名字,选择器查看或创建一个PIT表项;
step 4:进行进一步处理之前,在PIT和dead nonce list中检查NONCE,若存在匹配则认为兴趣包是由于环路或是多路径到达的重复包,将其交给Interest loop pipeline;
step 5:PIT项中的unsatisfy timer和straggler timer 由于到达一个新的有效兴趣包而取消,进一步扩展,在兴趣包处理路径中这两个计时器会被重置;
step 6:检测兴趣包是否是尚未满足的(PIT项是否有其他相同或不同接口的IN-record记录)
step7:若兴趣包不是为满足,将匹配CS,否则则不需要在进行CS匹配工作,此后根据CS满足与否,兴趣包处理进程选择进行Contentstore miss pipeline或Contentstore hit pipeline。

2. Interest loop兴趣包循环管道
该管道在Forwarder::onInterestLoop方法中实现,当检测到一个兴趣循环时,从incoming Interest pipelin传入的兴趣管道(第4.2.1节)输入。这个管道的输入参数包括一个兴趣包和它的输入face。如果是点对点的面,则此管道将带有原因代码副本的Nack发送到感兴趣的传入face。因为Nack的语义在多访问链路上是未定义的,如果进入的face是多访问的,那么循环的兴趣就会被简单地丢弃。

3. ContentStore miss
由Forwarder::onContentStoreMiss方法实现,在incomingInterest pipeline执行CS查找并且没有找到时进入。输入参数:兴趣包,进入接口,PIT项。

进入这个管道意味着兴趣包有效且不能被存储的数据满足,因此需要转发到其他地方:
step 1:兴趣包的in-record和他的进入接口创建在PIT中,当相同计入接口in-record已存在时,更新。in-record的过期时间有InterestLefttime 决定;默认值为4s;
step 2:PIT表项的unsatisfy timer在一个PIT项的所有in-record记录时效时失效。当他失效时执行Interest unsatisfied pipeline;
step3:最后管道通过调用Find effective strategy 来决定哪一个策略被使用来做转发决策。所选策略的after receive Interest触发器由兴趣包,进入接口,PIT表项调用。
大部分转发策略在处理一个新的兴趣包是会立刻将他转发给一个或多个上游,对于一个重传兴趣包大部分转发决策会选择抑制(前一次兴趣包转发在一个较短的时间内时)

4. ContentStore hit
由Forwarder::onCotentStoreMiss方法调用,在incoming Interest pipeline执行CS查找且找到时进入,输入参数:兴趣包,进入接口,PIT项,匹配的数据包。
该管道在兴趣包中设置straggler timer,匹配数据包通过outgoning Datapipeline 。兴趣包处理完成。

5. outgoing Interest
由Forwarder::onOutgoingInterest方法实现,又Strategy::sendInterest方法进入,用于处理策略的send interest action。输入参数:PIT项,outgoing接口,wantNewNonce标志。注意该管道输入参数中没有兴趣包,管道使用PIT表项,执行检查,获取相关兴趣包。
在这里插入图片描述
step1:最开始,首先检查/localhost和、localhop有效性:

  • 具有/localhost前缀的兴趣包不能通过non-local接口被发送;
  • 具有/localhop前缀的兴趣包只有当PIT项至少含有一个in-record表示local接口时可以由non-local接口发送
    step 2:从PIT表项中选择一个Interest,通常会选择最后进入的一个兴趣包,这样做因为每一个兴趣包的守卫时间(InterestLifeTime)不同;
    step 3:如果决策具有wantNewNonce标志,那么则复制该兴趣包并为其分配一个Nonce.。这是应为决策有可能需要重传该兴趣包,若nonce一致则会让上游节点错误的判定兴趣包是一个loop。
    step 4:在PIT表项中创建一个兴趣包的out-record,将表项插入特定输出接口。若输出接口有该表项或有out-record,则根据所选兴趣包中的InterestLifeTime更新。
    step 5:最后兴趣包通过接口转发。
  1. Interest finalze
    由Forwarder::onInterestFinalize方法实现,由straggler timer 或Interest unsatisfied pipeline进入
    首先该管道决定PIT中的nonce是否应该插入dead nonce list。这个表作为一个全局数据结构用来检测兴趣包环路,我们希望插入的nonce数量尽可能的少。只有outgoing nonce需要被插入。决定插入这将元组name,nonce插入列表中,此后从PIT中删除PIT表项。

数据包处理通道

NFD数据包处理过程如下:

  • incoming Data:处理进入的数据包
  • Data unsolicited:处理未经请求的数据包
  • outgoing Data:准备和发出的数据包

1. incoming Data
由Forwarder::onIncomingData方法实现,由Forwarder::stratProcssData方法进入,后者有Face::afterReceiveData 信号触发。输入参数:数据包,进入接口。
在这里插入图片描述
step 1:类似于兴趣包,/localhost检查,若一个数据宝来自non-local接口,前缀为/localhost,则丢弃这个数据包;
step 2:使用Data match algorithm为数据包匹配PIT项,若是不存在PIT则该数据包为一个未请求数据包,进入Data unsolicited pipeline;
step 3:若存在一个或多个PIT项,将数据插入CS中。管道将数据插入CS中,但是否存储,存储多久是由CS管理和替换策略决定的。
step 4:取消所找到PIT项的unsatisfy timer和straggler timer。
step 5:使用Find effective strategy 算法为PIT表项选择有效的决策算法
step 6:根据数据包进入接口将PITout-record的nonce插入Dead nonce list。
step7:PIT表项删除所有的in-record,和与数据包进入接口相应的out-record,以此标志为以满足项;
step 8:为该PIT项设置straggler timer。
step 9:最后,对处理当前数据包进入接口的每一个尚未满足下游,进入outgoing Data pipeline。进入参数:数据包和下游接口。注意,对每一个下游都只进行一次。

2. Data unsolicited
由Forwarder::onDataUnsolicited方法实现,由incoming Data pipeline,数据包被检测是未请求时进入。输入参数包括:数据包,进入接口。
通常情况下,未请求数据会被丢弃,因为它存在一定安全隐患,但是在一些特殊情况下需要将这些数据存储在CS中,(由local接口接受),如果用户希望接受non-local接口到来的未请求数据则需要对Forwarder::onDataUnsolicited进行更新。

3. outgoing Data
由Forwarder::onOutgoingData方法实现,由incoming interest pipeline数据在CS中存在匹配时,或incoming Data pipeline存在一个或多个PIT项时进入。输入参数:数据包,输出接口。
step 1:数据首先检查/localhost。具有/localhost前缀的数据不能从non-local接口发送出去。
step 2:流量管理,当前不采用任何流量管理实现。
step 3:通过输出接口将数据包发送出去。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值