# RDMA网络相对普通网络技术的优点
* 零拷贝
* kernel bypass
* CPU 无需参与

# 基本传输方式
* reliable 和 unreliable
其中,reliable 方式中 NIC 使用确认形式来保证消息的按顺序传递。而 unreliable不会进行确认。
* connected 和 unconnected (也叫 datagram):connected 的传输需要队列对(Queue Pairs)之间的一对一连接,而 unconnected的方式是一个 QP 可以与多个 QP 进行通信。RDMA 不同传输方式支持的 Verbs 类型:如下图(RC 指 reliable connected 传输方式,
* UC 指 unreliable connected 传输方式,UD
指 unreliable datagram。没有 reliable datagram 的传输方式)(参考数据的三种交换方式, 如下:)


对照上面的图,给出三种交换方式在数据传输阶段的主要特点:

电路交换:整个报文的比特流连续的从源点直达终点,好像在一个管道中传送。
报文交换:整个报文先传输到相邻的结点,全部存储下来后查找转发表,转发到下一个结点。
分组交换:单个分组(报文的一部分)传送到相邻结点,传送到相邻结点,存储下来后查找转发表,转发到下一个结点。

RDMA 原语

根据一次请求过程中是否需要远端CPU的参与,可以分为单边操作和双边操作。

RDMA 网卡在处理单边和双边原语时,需要使用队列对(Queue Pair)。
一个队列对 QP 包含两个队列,一个发送队列,一个接收队列,都由
RDMA 网卡负责维护。当调用 RDMA-Read、RDMA-Write 和 SEND 时,原
语被发送到发送队列,并在发送队列里被发送到远端主机的网卡;当
调用 RECEIVE 时,原语被发送到接收队列,并在接收队列里接收来自
远端主机的 SEND 请求。

# RDMA QP
RDMA 网卡在处理单边和双边原语时,需要使用队列对(Queue Pair)。
一个队列对 QP 包含两个队列,一个发送队列,一个接收队列,都由
RDMA 网卡负责维护。当调用 RDMA-Read、RDMA-Write 和 SEND 时,原
语被发送到发送队列,并在发送队列里被发送到远端主机的网卡;当
调用 RECEIVE 时,原语被发送到接收队列,并在接收队列里接收来自
远端主机的 SEND 请求。

RDMA 完成事件

每个队列对都对应一个完成事件队列(Completion Queue)。
当队列对中的某个队列的原语被操作完成时,例如,发送队列中的发
送原语发送到远程机器,或者接收队列中的接收原语接收到远程机器
的 SEND 原语,那么 RDMA 网卡会对应产生一个完成事件(Completion
Event),并将该事件存入到完成事件队列中。开发者可以通过相关
的接口来获取完成事件队列中的完成事件,以判断其之前调用的RDMA
原语操作的完成状态。但是,如果每个 RDMA 原语操作完成后,都对
应产生一个完成事件,势必会增加 RDMA 网卡的负担。RDMA 网卡提供
了一种称为 Selective Signaling 的机制来对其进行优化:开发者通
过 Selective Signaling 来告诉 RDMA 网卡有多少 RDMA 原语操作不需
要对应产生完成事件(假设这个数值为 N),那么 RDMA 网卡会对发
送队列中完成的连续 N 个 RDMA 原语操作不产生完成事件,而在完成
第 N+1 个 RDMA 原语操作时才会产生一个完成事件。这种机制可以大
幅提升发送 RDMA-Read、RDMA-Write 和 SEND 原语操作的性能,进而
提升系统的整体性能。需要注意的是,Selective Signaling 机制不
能用于接收队列,因此对 RECEIVE 原语操作不起作用。

RDMA 传输类型

RDMA 的传输类型分为两大类:连接模式和非连接模式,前者支持可
靠连接(Reliable Connection,RC)和非可靠连接(Unreliable
Connection,UC)两种传输类型,后者支持不可靠报文(Unreliable
Datagram,UD)传输类型。假设主机 A 和主机 B 通过连接模式进行通信,那么 A 和 B 之间的每一个连接都需要在 A 上对应一个唯一的队列对 QP,在 B 上也对应一个唯一的队列对,这两个队列对 QP 通过该连接绑定在一起。假设主机 A 和主机 B、C 通过非连接模式进行通信,那么A机只需要一个队列对就可以和主机B、C建立任意数目的连接。消息服务建立在通信双方 本端和远端应用之间创建的
Channel- -O IO 连接之上。当应用需要通信时,就会创建一条 Channel连接,每条 Channel 的首尾端点是两对 Queue Pairs(QP) ,每对 QP由 】】由 Send Queue(SQ)和 和 Receive Queue(RQ) 构成,这些队列中管理着各种类型的消息。QP 会被映射到应用的虚拟地址空间,使得应用直接通过它访问 RNIC 网卡。除了 QP 描述的两种基本队列之外,RDMA 还提供一种队列 Complete Queue(CQ),CQ 用来知会用户 WQ 上的消息已经被处理完。
DMA 提供了一套软件传输接口,方便用户创建传输请求
Work Request(WR),WR 中描述了应用希望传输到 Channel 对端的消息内容,WR 通知 QP 中的某个队列 Work Queue(WQ)。在 WQ 中,用户的 WR 被转化为 Work Queue Ellement(WQE)的格式,等待 RNIC 的异步调度解析,并从 WQE 指向的 Buffer 中拿到真正的消息发送到Channel 对端。 RDMA 中 中 E SEND/RECEIVE 是双边操作,即必须要远端的应用感知参与才能完成收发。D READ 和 和 E WRITE 是单边操作,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信,数据的读或写都通过 RDMA 在 RNIC 与应用 Buffer 之间完成,再由远端 RNIC 封装成消息返回到本端。在实际中SEND /RECEIVE 多用于连接控制类报文,数据报文多是通过 E READ/WRITE 来完成的。

单边操作总结

单边操作传输方式是 A RDMA 与传统网络传输的最大不同,只需提供直接访问远程的虚拟地址,无须远程应用的参与其中,这种方式适用于批量数据传输。

RoCE

RoCE v2 协议使用的是 UDP/IPv4 或者 UDP/IPv6。UDP 目的端口
号 4791 就是给 RoCE v2 预留的。由于 RoCE v2 报文能够支持路由功
能,因此有时候也称他为可路由的 RoCE 或者 RRoCE。尽管在通常情
况下 UDP 报文的传输顺序是没有保证,但是 RoCE v2 规范要求了有相
同 UDP 源端口和目的地址的报文必须顺序传送。另外,RoCE v2 定义
了拥塞控制机制,即使用 IP ECN 位来进行标记,同时用 CNP 帧来进
行确认。当前 Mellanox OFED 2.3 及更新的版本,Linux Kernel v4.5
都能够支持 RoCE v2,总体来说支持 RoCE v2 的软件还处于新兴阶段。