版权声明:文章来源/微信公众号“网络技术风云汇” ——【NS3】RDMA报文接收过程串讲
以HPCC的NS3仿真代码为蓝本(https://github.com/alibaba-edu/High-Precision-Congestion-Control)
上一篇文章介绍的 【NS3的流完成时间计算方法】,本文解释HPCC代码中的报文接收过程。
前言
HPCC在NS3中的仿真,协议栈自上而下简化为:
RdmaClient --> RdmaDriver --> RdmaHw --> QbbNetDevice --> Swich节点发送。
接收过程是反过来的。
注意:此处的QbbNetDevice不能理解为网卡,而应该理解为网络设备。因为在网络中,能接收从通道发来数据的不仅仅是网卡,交换机也能收到数据。后面会进行区分。
网络通道-->网络设备
第一步:网络信道QbbChannel将数据发送到网络设备QbbNetDevice。这是一个调度事件,QbbChannel收到来自其他设备的数据包后,会在链路时延后通知QbbNetDevice,也就是网络设备接收数据。
此处也是配置的链路时延真正起作用的地方,也就是控制数据包到达对方设备的时间(调用对方的数据接收函数)。
第二步:网络设备则会接收到来自QbbChannel的数据包。
第三步:先处理PFC数据包。无论本设备是交换机还是主机,先判断收到的报文是不是PFC。
1、收到pfc,但未使能PFC功能,则直接退出,继续后面的处理。
2、使能pfc,则会根据报文是pause和resume进行进一步的处理,此处不再细化。
第四步:收到的数据若不是PFC报文,则数据包则是普通的数据或控制信令。
如上所述,因为接收到数据的设备可以是主机,也可以是交换机,因此会根据当前设备的类型(0:主机;1:交换机)进行区分处理。
1、如果是交换机,则会继续发往下一个网络设备(交换机或主机网卡):
2、如果是主机网卡设备,则会通知主机进行接收,第四步下图第413行所示。。
注意:m_rdmaReceiveCb真实调用RdmaHw::Receive()来继续进行主机数据接收。这是通过如下的回调函数绑定的:
第五步:主机接收到报文,并进一步区分报文类型,并进行相应的处理。
代码很清晰。例如收到UDP数据报文后,则要查找对应的接收QP,还要判断是否产生cnp标记,然后通过ack报文携带回发送端。如下图所示:
如果收到的数据是cnp,则需要调用对应拥塞控制算法进行处理,这也是很多尝试修改拥塞控制算法的同学需要进行魔改的地方。
收到ACK报文的话,涉及到判断流是否结束,判断乱序,以及各拥塞控制算法对ACK的处理。
例如,如果使用的是HPCC算法,则要逐ACK进行速率处置(具体参加论文):
而像DCTCP则是其他的处理方式,不再赘述。
至此,报文接收的过程大致梳理了一遍。