NFD-C通信基本流程
以ping命令为例讲解NFD-C具体是怎么工作的:
首先,ping的用法如下:在两端运行NFD-C程序,并完成创建face和建立路由之后,服务器执行(ping在tool文件夹中)
1 | sudo ping-server -p ndn |
客户端端执行
1 | sudo ping -p ndn |
实际上从应用层向网络层发送的包主要包括两种,一种是管理信息包,通过tools/nfdc/nfdc-xxx
发送,另外一种是实际用来拉取数据的包(比如ping),涉及到tools/app/xxx.cpp(对应消费者端)。管理兴趣包需要在ping之前进行,这样在ping的时候才能找到对应的转发路径。
ping实际上主要涉及到了应用层像网络层真正用来拉去数据的包,在这里就是ndn,另外一种是用于向本节点的网络层发送管理信息的兴趣包,比如/localhost/face/show
代表要展示对应face的内容,这种管理信息发送到网络层forworder
之后不会被转发,而是直接进入on_mgmt_interest
,对管理兴趣包进行解析。
管理兴趣包最重要的就是创建face和创建路由。NFD-C对应真实的物理链路,每一个face只能连接到一个其他的机器上的一个face,相当于P2P。创建face之后就会向本节点的forwarder转发face的管理信息,forwarder会根据管理信息对节点的face进行维护,路由也是一样,当创建路由之后会操作fib对应的链表,在fib中添加路由。(在nfd/mgmt/mgmt.c中)。只有创建好了face和route,后期NFD才能进行转发
1 | 创建face |
在创建好了face和路由之后,在使用ping命令就会进行转发,其基本流程为:
ping端:主要包括express_interest和process_events。
ping-server端:包括set_interest_filter和on_interest。set_interest_filter向自身节点的NFD发送/localhost/route/add/%s/app
管理信息包,这样会添加一条本地应用层节点到NFD的路由。on_interest是当ping-server接收到ping发送的兴趣包后调用的回调,主要目的就是返回数据包。
具体消费者到生产者流程:不包括转发时对各个table的处理
- 解析命令行字段,提取prefix,根据prefix构造兴趣包。
- 主线程调用process_events继续监视自身的app_face,当返回数据包时进行相应的处理,子线程调用run函数发送兴趣包。
- run函数就是根据输入的时间间隔参数发送兴趣包,根据prefix填写兴趣包对应的字段,然后进入express_interest函数发送兴趣包。(实际上ping和管理信息兴趣包都调用此函数,但是ping的timeout回调是空的,管理信息兴趣包回调都有,回调对应一些可视化输出)。
- express_interest会检查app_face对应的PIT表,这个和forwarder中的表是不一样的。如果PIT没有这个条目,就添加进去,然后将兴趣包进行TLV编码,将网络层包转换为数据链路层包,然后发送给NFD。这里面的发送实际上是通过var/nfd.sock套接字实现的。发送兴趣包时,应用层向套接字中写数据,NFD网络转发层在套接字中读数据。
- NFD读取到编码后的兴趣包后,会判断这个包是兴趣包,数据包还是NACK包,然后进入相应的转发管道。如果需要转发,NFD就会根据FIB表将兴趣包转发到其他节点对应的端口。(FIB表是创建路由时建立的)。
- 生产者端的NFD收到对应的编码后的兴趣包后,发现自身能满足兴趣包(根据set_interest_filter是否注册过判断),这时候就会将数据包编码并写到自身的套接字中,ping-server应用层程序就可以读取套接字文件的内容。
- ping-server应用层程序返回对应的数据包,写到套接字中,自身节点的NFD读套接字中的文件,根据FIB进行转发,最后到生产者端的NFD。
- 生产者将编码后的数据包读出,通过process_events进行后续的处理,包括对数据包进行解码,擦除PIT表项,进行可视化输出等。