ns-3 源码学习笔记(2):RDMA 报文发送和接收过程
写在前面
主要针对数据包发送和接收的过程进行具体分析。
一、报文发送过程
1.1 概述
sequenceDiagram
participant App as 应用层(RdmaClient)
participant HW as RDMA硬件(RdmaHw)
participant NIC as 网卡(QbbNetDevice)
participant Channel as 链路(QbbChannel)
participant Switch as 交换机(SwitchNode)
participant MMU as 内存管理(SwitchMmu)
participant DestNIC as 目标网卡(QbbNetDevice)
participant DestHW as 目标RDMA硬件(RdmaHw)
App->>HW: 创建队列对(QP)
HW->>NIC: 请求发送数据包
HW->>HW: GetNxtPacket()生成数据包
HW->>NIC: 返回数据包
NIC->>NIC: DequeueAndTransmit()
NIC->>Channel: TransmitStart()
Channel->>DestNIC: 调度接收事件
alt 目标是交换机
DestNIC->>Switch: SwitchReceiveFromDevice()
Switch->>Switch: GetOutDev()查找路由
Switch->>MMU: CheckIngressAdmission()
MMU-->>Switch: 准入控制结果
alt 准入成功
Switch->>MMU: UpdateIngressAdmission()
Switch->>MMU: UpdateEgressAdmission()
Switch->>MMU: CheckShouldPause()
alt 需要PFC
MMU-->>Switch: 返回需要PFC
Switch->>DestNIC: SendPfc(pause)
DestNIC->>Channel: 发送PFC帧
end
Switch->>DestNIC: SwitchSend()
DestNIC->>Channel: 转发数据包
Switch->>MMU: RemoveFromIngressAdmission()
Switch->>MMU: RemoveFromEgressAdmission()
Switch->>MMU: CheckShouldResume()
alt 需要恢复
MMU-->>Switch: 返回需要恢复
Switch->>DestNIC: SendPfc(resume)
DestNIC->>Channel: 发送PFC恢复帧
end
alt ECN标记
Switch->>Switch: 设置ECN位
end
alt INT处理
Switch->>Switch: 添加/更新INT信息
end
else 准入失败
Switch->>Switch: 丢弃数据包
end
else 目标是终端
DestNIC->>DestHW: Receive()
DestHW->>DestHW: ReceiveUdp()
DestHW->>DestNIC: 生成ACK/NACK
DestNIC->>Channel: 发送ACK/NACK
Channel->>NIC: 接收ACK/NACK
NIC->>HW: 处理ACK/NACK
HW->>HW: 更新拥塞控制状态
end
RDMA 在 NS3 中的报文发送过程遵循从上至下的协议栈流程,即 RdmaClient
RdmaDriver
RdmaHw
QbbNetDevice
网络
。关于应用层通过 RdmaClient
发起 RDMA 传输请求,驱动层 RdmaDriver
作为中间层,将请求传递给 RdmaHw
,再由硬件层 RdmaHw
创建队列对并负责数据包的生成,已经在前一篇文章《ns-3 源码学习笔记(1):RDMA 的实现》的分析。本文重点关注数据包的实际传输过程,即网络通道 网络设备;
1.2 网络设备层 QbbNetDevice
网络设备层 QbbNetDevice
负责实际的数据包发送操作,它通过 DequeueAndTransmit
方法从队列中取出数据包并发送。
注意,这里的网络设备层 网卡,RDMA 的基础模型中,确实认为端到端的通信中两者直接通过控制 RDMA NIC 传输数据,实际过程中,中间可能还需要经过交换机(DC Switch)。网卡和交换机都能收到数据并进行发送,在下面的方法实现中也可以看出。
1 |
|
两者在发送逻辑和状态管理上略有不同,但是都通过 TransmitStart
方法将数据包发送到网络通道:
1 |
|
1.3 网络通道 QbbChannel
QbbChannel
接收来自 QbbNetDevice
的数据包,并在链路延迟后将数据包传递给目标设备:
1 |
|
二、报文接收过程
报文接收过程是发送过程的逆向,从网络通道到应用层:网络
QbbNetDevice
RdmaHw
RdmaDriver
RdmaClient
。
2.1 网络通道 网络设备
当数据包通过网络传输到达目标节点时,首先由 QbbChannel
将数据包传递给 QbbNetDevice
。这是通过 NS3 的事件调度机制实现的:
1 |
|
参考资料
- Alibaba’s HPCC Codes, https://github.com/alibaba-edu/High-Precision-Congestion-Control ; ↩
- NS-3 官方文档, http://www.nsnam.org/documentation/ ; ↩
- 【NS3】图文详解报文接收过程, https://www.ngdcn.com/post/236.html ; ↩
ns-3 源码学习笔记(2):RDMA 报文发送和接收过程
https://blog.yokumi.cn/2025/07/15/ns-3 源码学习笔记(2):RDMA 报文发送和接收过程/