1.1 数据经过一次SEND/RECV的流程
- 接收端APP以WQE的形式下发一次RECV任务到RQ。
- 发送端APP以WQE的形式下发一次SEND任务到SQ。
- 发送端硬件从SQ中拿到任务书,从内存中拿到待发送数据,组装数据包。
- 发送端网卡将数据包通过物理链路发送给接收端网卡。
- 接收端收到数据,进行校验后回复ACK报文给发送端。
- 接收端硬件从RQ中取出一个任务书(WQE)。
- 接收端硬件将数据放到WQE中指定的位置,然后生成“任务报告”CQE,放置到CQ中。
- 接收端APP取得任务完成信息。
- 发送端网卡收到ACK后,生成CQE,放置到CQ中。
- 发送端APP取得任务完成信息.
1.2 说明
说明一:首先是接收端先准备好,然后再通知发送方来发送数据,至于接收方通知发送方的机制未知,是事先商量好的,并由驱动完成。
说明二:任务书里的内容,即从内存中取数据,要经过虚拟内存的映射,而不是直接取,即任务书里存的是虚拟内存的地址。
说明三:接收端收到一个数据,就会产生一个CQE,而发送端要最后才能产生CQE;
2 名词解释
2.2.1 名词表
2.2.2 部分名词
WQ :Work Queue,是一个储存工作请求的队列。
WQE:Work Queue Element,工作队列元素,WQE可以认为是一种“任务说明”,这个工作请求是软件下发给硬件的,这份说明中包含了软件所希望硬件去做的任务以及有关这个任务的详细信息。比如,某一份任务是这样的:“我想把位于地址0x12345678(虚拟内存地址,并非实际内存地址)的长度为10字节的数据发送给对面的节点”,硬件接到任务之后,就会通过DMA去内存中取数据,组装数据包,然后发送。即软件是创建WQE的,而硬件是消耗WQE的。
SQ:Send Queue,发送工作队列。
RQ:Receive Queue,接收工作队列。
QP: Queue Pair, 即SQ和QR组成的一对队列,RDMA技术中通信的基本单元是QP.
WQ: 表示一种可以存储WQE的单元,SQ和RQ才是实例。
SRQ: Shared Receive Queue,共享接收队列, 表示一种几个QP共享同一个RQ。由于使用RQ的情况要远远小于使用SQ,而每个队列都是要消耗内存资源的,当我们需要使用大量的QP时,可以通过SRQ来节省内存。
CQ: Completion Queue,完成队列。
CQE:Completion Queue Element,可以认为CQE跟WQE是相反的概念,如果WQE是软件下发给硬件的“任务书”的话,那么CQE就是硬件完成任务之后返回给软件的“任务报告”。CQE中描述了某个任务是被正确无误的执行,还是遇到了错误,如果遇到了错误,那么错误的原因是什么。
WR:Work Request,工作请求,用户开发时实际用到的概念,即用户开发时通过API下发WR,而驱动自动会将WR转换成WQE。
WC:Work Completion,工作完成,用户开发时实际用到的概念,即用户开发时通过API收到WC,驱动自动会将WC转换成WCE。