NFD转发进程处理Interest包的流程

Posted Tiancfq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFD转发进程处理Interest包的流程相关的知识,希望对你有一定的参考价值。

函数调用:afterReceiveInterest (const Interest& interest, const FaceEndpoint& ingress,  const shared_ptr<pit::Entry>& pitEntry)


tips:以下内容结合下面图片搭配使用效果会更好!

 

 

首先检查在pit表中是否有记录:
  •     false:

faceToUse = getBestFaceForForwarding(interest, ingress.face, fibEntry, pitEntry) 寻找所有的可用的下一跳,然后获取接口的信息
函数过程:设置一个时钟,从fib表中遍历所有可用的下一跳,插入一个表中,排序:rankedFaces.insert(下一跳的接口、上一次的rtt、srtt、cost)
最后根据
如果没有可用的下一跳,输出:从xx接口进入的一个新的interest没有下一跳,并且执行sendNoRouteNack
如果有可用的下一跳,
 
forwardInterest(const Interest& interest, Face& outFace, const fib::Entry& fibEntry, const shared_ptr<pit::Entry>& pitEntry)  
函数过程:首先获取转发的Interest的名字以及转发出去的接口,auto* outRecord = sendInterest(interest, outFace, pitEntry) 转发并记录
m_measurements.getOrCreateFaceInfo(fibEntry, interestName, faceId); 在fib表中记下转发Interest包的名字以及接口。
重新刷新每个接口的时间,因为这次转发已经结束了。
返回一个记录Outrecord
 
sendProbe(const Interest& interest, const FaceEndpoint& ingress, const Face& faceToUse, const fib::Entry& fibEntry, const shared_ptr<pit::Entry>& pitEntry) 发送一个探测消息,
该函数里面还有一个forwardInterest,为什么?(测试该接口是否可以转发,如果可以则转发)
 
  • true

首先也还是获取一下最好的转发接口,faceToUse = getBestFaceForForwarding
检查该接口的RetxSuppressionResult状态,如果返回的结果是suppression 抑制,不进行转发
如果不抑制的话,执行forwardInterest,返回一个Outrecord,RetxSuppressionResult,再进行一次检测,如果outRecord && suppressResult == RetxSuppressionResult::FORWARD,可以转发(不需要探测)
retx 在抑制期之后到达:转发它但不探测,因为在新接收到它时针对此兴趣进行了较早的探测
 
没有可用的faceToUse。如果所有符合条件的接口都已被使用(即它们都有待处理的输出记录),则选择具有最早输出记录的下一跳。过程跟上面的一样。

 

谁人畏惧现实,谁人将从梦中消失

以上是关于NFD转发进程处理Interest包的流程的主要内容,如果未能解决你的问题,请参考以下文章

软件定义网络基础---SDN数据平面

NGFW中数据包转发流程

在C中java.text.Normalizer.Form.NFD和utf8 proc之间的编码问题

Linux系统下网络数据包的处理流程

404 Not Found 探秘Nginx转发处理流程

PHP-FPM源码分析