rdam data flow
1.bth.psn作用
–1.数据包顺序标识:接收方按PSN顺序重组报文;
–2.丢包检测与重传:通过ACK/NAK反馈机制
–3.流控:防止接收方缓冲区溢出;
2.tx_psn_manager在rdma中的一个流程:
--1.驱动填充WQE:填充操作类型、sge等;
--2.psn分配与发送:分配psn并写入bth头;WQE信息存入wqe_linklist,记录PSN范围(PSN=100~103)
--3.ACK处理:接收方返回ACK(PSN=103), 标记psn<=103的报文确认;
--4.NAK/超时处理:若收到NAK(PSN=101)或超时,从wqe_linklist中取出wqe>=101的WQE重新发送;
----为什么需要保存WQE信息?
重传可靠性:需要保证数据可靠传输,重传依赖原始WQE信息;
零拷贝优化:重传时无需驱动再次参与,由硬件直接处理;
3 rq_doorbell机制是什么?以及如何产生的?
Rq_doorbell作用:host driver通过写入doorbell寄存器(在网卡的PCIE BAR空间),通知网卡:接收队列-Rq中已新增了N个WQE(即内存注册区域),用他们来存储即将达到的数据包;
RQ_doorbell_handle:是只有需要用到rq_wqe时,才会采取拉rq_wqe;
4.requester端的qp_id和respond端的qp_id是同一回事吗?
Requester 的QPN和respond端的QPN不需要相同,不是同一回事;通信中,请求端(Requester)的QP_ID不会直接传递给响应端(Responder),且两端的QP_ID通常是不同的,各自独立管理。
requester端在发送rdma操作时,会在报文头(bth)中携带des qpn来进行指定;(requester自身QPN不会直接传递给respond端,除非在连接建立阶段通过CM协议显示交换信息);Respond根据des QPN找到本地对应的QPC;
在这里为什么requester端会拿到respond的qpn即dest qpn,是因为在建立rdma通信时,会首先QP建立;所以会填充respond端的dest qpn;
简单示例流程:
–1.Requester端(QP=100):
填充WQE(Work Queue Entry),指定操作类型(RDMA_WRITE)、目标GID和QP=200。
报文发送时,BTH头中写入 Dest QP=200;
–2.Responder端(QP=200):
解析报文头,确认目标QP=200,查找本地QP上下文(如内存权限、PSN状态)。
执行DMA写入,将Payload写入主机内存。
–3.ACK返回:
Responder生成ACK报文,目标QP为Requester的QP=100(通过连接映射关系确定),但该QP_ID仅在Requester本地有效。
5.respond端在发送ack报文时,如何知道requester端的qpn来进行填充bth?
在rdma(RoCEv2)通信中,requester端的qpn不会显示包含在发送的报文中,respond端在发送ack报文时,获得requester的qpn流程如下:
1.在QP连接建立阶段:
在RDMA通信开始前,Requester和Responder通过 CM(Connection Manager)协议 建立连接,主要完成:
–1.requester端和respond端在软件层通过CM协议交换各自的GID和QPN;GID(Global Identifier) 是用于 全局唯一标识网络中节点或接口的地址,类似于IP地址的概念;
–2.映射表维护:
双方在本地维护QP映射表,记录“GID和QPN”来映射QP;
* requester记录:GID_B + QPN_Resp ➔ 本地QP_Req;
* responder记录:GID_A + QPN_Req ➔ 本地QP_Resp;
2.ACK报文的目标QPN获得:查找本地映射表;
6.requester端和respond端网卡通信?
先明确的是:在网卡与网卡之间的通信是以以太网口来物理连接,传输的是标准的以太网报文;
其封装格式:
| Ethernet | IP | UDP | BTH (Base Transport Header) | RETH (RDMA Extended Transport Header) | Payload |
* Bth: 包含opcode,目标QP号,PSN等信息;
* RETH: 包含远程dest remote_Vaddr, length,rkey; requester中的这个地址具体指的的是接收端预先注册的内存地址;需要在经过本地注册的MR(Memory Region)和PD(Protection Domain)来进行地址转换和权限检查; 具体有MPT和MTT表格;如果接收端没有预先注册对应的内存区域,或者rkey验证失败,操作会被拒绝。
这会具体涉及到内存注册和地址转换机制;
在RDMA通信建立中的预分配的缓冲区地址--即内存注册区:
--1.内存注册(MR: Memory Registration)
接收端在通信前需预先分配内存缓冲区,并通过驱动将其注册到网卡。这一过程会生成 内存区域(Memory RegionMR) 和 保护密钥(rkey/lkey)。名词概念:
• MR:描述内存的物理地址范围和访问权限;
• Rkey:供远端remote dma验证权限;
• Lkey:供本地验证DMA操作权限;
--2.接收队列
接收端在驱动下通过RQ(receive queue)来放置WQE,每个WQE来描述内存注册区的地址addr、长度和key;
网卡在接收数据时,从RQ中获取可用的WQE,来确定写入的目标地址;
在涉及取rq_cqe时,必须生成rq_CQE并触发中断MSI-X来通知主机,这样上层能释放rq_cqe;
传输路径:是requester端通过以太网发送RoCEv2报文,经过标准的交换机和路由器来到达respond端;
respond端网卡处理流程:
1.链路层解析:剥离以太网帧头(MAC地址、VLAN标签等),验证FCS(Frame Check Sequence)确保数据完整性;
2.网络层解析:剥离IP头部,确认目标IP地址是否为本机。检查UDP端口号(默认为4791),识别为RoCEv2流量。
3.RoCEv2协议处理:解析BTH头,获取目标QP号和操作类型;
4.数据写入内存(TLP):根据qpc以及addre、length,再验证key和VA–>PA,然后发起一个pcie MemWR TLp,将payload直接写入主机内存;
5.完成通知:在respond端涉及取rq_wqe,需要生成rq_cqe并触发中断MSI-X来通知主机;同时也是发送ack报文来返回requester端;