[友猫]NFD Developers Guide--Forwarding Strategy(一)

在NFD的转发中,转发策略提供是否转发,何时转发,向何处转发的智能决策,在NFD中转发策略和转发管道一起构成包的处理逻辑。当一个兴趣需要决定是否转发是。转发管道会触发转发策略。此外,转发策略可以在其转发出口接受消息,例如所转发的兴趣包合适被满足,时间超时,NACK返回。
我们知道不同的NDN应用据要不同的转发行为。例如文件检索应用需要从一个内容源以最高的带宽检索内容;媒体聊天应用则需要最低的时延,数据集同步库则需要多播兴趣包道所有可能的接口。这些不同的行为激发块NFD中多种不同的转发策略。
尽管NFD有许多不同的策略,但对一个兴趣包只能采用一种策略。NFD为每个名字域实现策略选择,有种操作可以配置名字前缀的特定策略,在该名字前缀下的兴趣包将以这种策略进行处理。这种配置结果被记录在策略选择表中。
当前,转发策略的配置是本地配置,统一个兴趣包在不同的节点上可能会出现完全不同的策略,在2016年提出一种Routing annotation方法。

1.策略API

从概念上讲,策略是为抽象机器(即策略API)编写的程序。该抽象机器所使用的语言包括bianzhuui算数和逻辑,以及与其他NDF组成部分的互操作,其状态被存储在NFD表中。
每一个NFD策略作为nfd::fw::Strategy基类的子类实现,用以提供了策略API用于实现策略与其他NFD部分的互操作。API是策略唯一可以接入NFD元素的方法,应此API的可用功能决定了策略可以或不可以做什么。
策略由一个触发器调用,转发决定用ACTION作出,策略允许向特定表中存入数据。

trigger

触发器是策略程序的入口,一个触发器被声明为nfd::fw::Strategy类的虚方法,并有子类重写。

After Receive Interest Trigger
该触发器声明为Strategy::afterReceiveInterest方法,该方法是一个纯虚方法,必须被子类重写。当一个接收到兴趣包,通过必要的检查,需要被转发时,Incoming Interest pipeline用当前兴趣包,静如接口,PIT项调用该触发器以下条件适用与该兴趣包:

  • 兴趣包不违背/localhost;
  • 兴趣包不存在环路;
  • 兴趣包不能被CS满足;
  • 兴趣包在改色路管理的名字域下。

被触发后,策略应决定是否,何时,向何处转发当前兴趣包。大部分策略都需要FIB表项来做决定,FIB可以通过调用Strategy::lookupFib获得。如果策略决定转发该兴趣包,将至少调用一次send Interest action;它可以之间调用也可以在一段时间以后在调用。如果策略得出该兴趣包不能被转发则调用reject pending Interest action ,在一段时间后删除PIT表项。

Before Satisfy Interest Trigger
该触发器声明为Strategy::beforeSatisfyInterest方法,该基类提供默认实现(不做处理),如果策略需要调用该触发器子类可以重写。
当PIT表项在数据发送给下游之前被满足,Incoming Data pipeline用PIT项,数据包,进入接口调用该触发器注意PIT表项既可以待项撒谎嗯为满足兴趣包也可以表示最精满足兴趣包。

Before Expire Interest Trigger
该触发器声明为Strategy::beforeExpriePendingInterest方法,该基类提供默认实现(不做处理),如果策略需要调用该触发器子类可以重写。
当PIT项应在所有in-record失效之前没有被满足而失效时,在他删除之前,Interest Unsatisfied pipeline 用PIT表项调用该触发器,此时PIT项代表撒谎功能为满足兴趣包。
注意在调用reject pending interest action 时不会调用该触发器。

After Receiver Nack Trigger
该触发器声明为Strategy::afterRecevieNack方法,该基类提供默认实现(不做处理jiushishuuo所有进入的NACK都会被丢弃,不会通过至下游),如果策略需要调用该触发器子类可以重写。
当兴趣包被接受,通过一定检查,Incoming Nack pipeline 用Nack包,进入接口,PIT项调用该触发器。
此时:

  • Nack作为已转发兴趣包回应;
  • Nack确认是最后一个转发至上游兴趣包的回应;
  • PIT项在该策略管理的名字域下;
  • Nack 首部已被记录在PIT的out-record的 Nacked 域中;

被触发后,策略回特定的做出下种行为之一:

  • 重试,通过调用send interest action 转发兴趣包道统一或不同的上游,大多数策略需要FIB表象计算可能的上游。(Strategy::lookupFib)
  • 放弃并返回向下游返回NACK(调用send NACK action);
  • 不做任何处理。当不是所有的上游都返回NACK时,策略回继续等待返回数据或NACK,在这种情况下策略不需要记录NACK在他的StretagyInfo中,应为NACK首部已经在PIT out-record中记录。
  • 在这里插入图片描述

Action

action 是策略的转发决定。action作为nfd::fw::Strategy类的非虚保护方法
Send Interest action
实现:Strategy:sendInterest 方法,参数:PIT项,输出接口, wantNewNonce标志。
进入Outgoing Interest pipeline。

VIRTUAL_WITH_TESTS void
  sendInterest(const shared_ptr<pit::Entry>& pitEntry, Face& outFace,
               const Interest& interest)
  {
    m_forwarder.onOutgoingInterest(pitEntry, outFace, interest);
  }

Reject Pending Interest action
实现:Stretagy::rejectPendingInterest 方法,参数:PIT项。
进入Interest reject pipeline;

 VIRTUAL_WITH_TESTS void
  rejectPendingInterest(const shared_ptr<pit::Entry>& pitEntry)
  {
    m_forwarder.onInterestReject(pitEntry);
  }

Send Nack action
实现:Strategy::sendNack方法,参数:PIT项,下游接口,Nack首部。
进入outgoing Nack pipeline。

VIRTUAL_WITH_TESTS void
  sendNack(const shared_ptr<pit::Entry>& pitEntry, const Face& outFace,
           const lp::NackHeader& header)
  {
    m_forwarder.onOutgoingNack(pitEntry, outFace, header);
  }

通常策略需要向每一个下游发送NACK,Strategy ::sendNack就用来帮助实现该目的,输入包括PIT项和NACK首部,调用该HELPER 方法和对每一个下游调用send NACK action是一样的。

void
  sendNacks(const shared_ptr<pit::Entry>& pitEntry, const lp::NackHeader& header,
            std::initializer_list<const Face*> exceptFaces = std::initializer_list<const Face*>());

Storage

策略允许在PIT项,PIT in-record,PIT out-record,以及测量表项中存储任何信息,所有这些多源自于StrategyInfoHost type。测量表项的接入通过Strategy::getMeasurements方法。策略的访问仅限于在其控制下的名称空间下的测量条目。
策略特殊信息应该被包含在StrategyInfo的子类中,在任何时候策略可以通过调用StrategyInfoHost的getStrategyInfo, insertStrategyInfo, 和 eraseStrategyInfo来存储或检索信息。需注意,策略必须确保每一个StrategyInfo有不同的TypeId;若同一TypeId给多个类型,NFD很可能崩溃。
因为名字域下的策略选择可以在运行时改变,因此NFD确保所有的在该过渡名字域下的策略存储条目将被销毁。因此,策略必须为某些可能没有策略存储项的实体有所准备;如果存在某个项,则确保其类型正确。存储项的析构函数还必须取消所有计时器,以便策略不会在不再受其控制的实体上激活。
策略只允许使用以上方法存储信息,策略对象(Strategy的子类)应该是无状态的。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值