[友猫]NFD Developers Guide--Forwarding

NFD中包的处理过程包括forwarding pipeline和forwarding strategies组成。转发管道由特定时间触发的一系列处理包或者处理PIT表项的步骤,,这些特殊事件包括接受兴趣包,检测到接受兴趣包环路,兴趣包准备通过接口进行转发等等。转发决策是一个兴趣包是否转发,何时转发,向何处转发的决策者,同时,管道提供决策,兴趣包相关信息来做出决策。
下图所示白色为决策点。蓝色为管道。
在这里插入图片描述

1.Forwarding Pipeline

管道用于处理网络层的包(兴趣包,数据包,NACK)每一个包需要通过一个管道到达另一个管道(或者通过决策点到达)知道所有的处理程序结束。管道的处理过程需要使用CS,PIT,dead nonce list,FIB,strategy choice,最后三个表对管道处理来说只读。
FaceTable记录所有NFD中的活动接口。同时这些接口也是管道处理的网络层包的来源,管道允许通过这些接口发送包。我们将转发管道分为:兴趣包处理路径(Interest processing Path),数据包处理路径(Data processing Path),NACK处理路径(NACK processing Path).

2.Interest processing Path

NFD将兴趣包处理路径有进一步划分为:

  • incoming Interest:处理进入的兴趣包;
  • Interest loop:处理进入的环路兴趣包;
  • ContentStore miss:处理未能被所存储数据满足的进入的兴趣包;
  • ContentStore hit:处理可被存储数据满足的进入兴趣包;
  • outgoing Interest:准备发送兴趣包(out);
  • Interest reject:处理由决策拒绝的PIT表项;
  • Interest unsatisfied:处理在所有下游到时之前没有被满足的PIT表项;
  • Interest finalze:删除PIT表项

incoming Interest:

由Forward::onIncomingInterest方法实现,由Forwarder::StratProcessInterest方法进入,后者有F
cae::afterReceiverInterest信号触发。输入参数:接受到的兴趣包和该兴趣包进入的接口。
在这里插入图片描述
step 1:检查/localhost。通常来说从non-loacl进入的兴趣包一般应该具有/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。

Interest loop
由Forwarder::onInterestLoop方法实现,由incoming Interest pipeline进入。输入参数:兴趣包,进入接口。
当进入接口是P-P接口时,该管道发送一个NACK到兴趣包进入接口;当进入接口时MULTI-ACCESS 时,直接丢弃。应为multi-accsee链路上NACK同步并没有被定义。

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表项调用。
大部分转发策略在处理一个新的兴趣包是会立刻将他转发给一个或多个上游,对于一个重传兴趣包大部分转发决策会选择抑制(前一次兴趣包转发在一个较短的时间内时)

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

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:最后兴趣包通过接口转发。

Interest reject
由Forwarder::onInterestReject方法实现,由Strategy::rejectPendingInterest方法进入,用于处理决策reject pending interest action。输入参数:PIT表项。
该管道取消unsatisfy timer,设置Straggler timer,一旦后者到期就会进入interest finalize pipeline。

incoming Data
由Forwarder::onInterestUnsatisfied 方法实现,在unsatisfy timer(所有下游的InterestLifeTime
到时)到时时进入。输入参数:PIT表。
在这里插入图片描述
step 1:使用find effective strategy 算法在算法选择表中选择PIT表项的决策算法;
step 2:调用PIT表项决策算法的before expire interest action 作为输入参数;
step 3:进入Interest Finalize pipeline.

Interest finalze
由Forwarder::onInterestFinalize方法实现,由straggler timer 或Interest unsatisfied pipeline进入。
首先该管道决定PIT中的nonce是否应该插入dead nonce list。这个表作为一个全局数据结构用来检测兴趣包环路,我们希望插入的nonce数量尽可能的少。只有outgoing nonce需要被插入。决定插入这将元组name,nonce插入列表中,此后从PIT中删除PIT表项。

3.Date processing Path

NFD中数据处理进程分为:

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

incoming Data
由Forwarder::onIncomingData方法实现,由Forwarder::stratProcssData方法进入,后者有Fcae::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。进入参数:数据包和下游接口。注意,对每一个下游都只进行一次。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值