而基于QP的通信模型有很多种,我们在RDMA领域称其为“服务类型”。IB协议中通过“可靠”和“连接”两个维度来描述一种服务类型。
可靠
通信中的可靠性指的是通过一些机制保证发出去的数据包能够被正常接收。IB协议中是这样描述可靠服务的:
Reliable Service provides a guarantee that messages are delivered from a requester to a responder at most once, in order and without corruption.
可靠服务保证了消息从发送方发送到接收方,最多一次、按需并且没有冲突
IB通过以下三个机制来保证可靠性
应答机制
ACK
IB支持累计应答

数据校验机制
发送端会对HEADER和PAYLOAD通过一定算法得到一个校验值CRC放到数据包的末尾,对端收到数据包后,会用相同算法计算出校验值,然后与数据包中的校验值比对,如果不一致,则说明数据中包含错误(一般是链路问题导致的),那么接收端则会丢弃该数据包。**注意,ICRC校验发生在链路层,而NAK的发送发生在下一个PACKET到达时候,在失序数据包到达时才发送NAK。**IB使用的CRC校验,本文不作详细介绍。

保序机制
保序机制指的是保证先被发送到数据链路上的数据包一定要先于后发送的数据包被接收方接收到,IB协议中存在PSN(包序号,类似TCP/ip)概念,PSN可以用来检测是否丢包

连接与数据报
连接
连接在此处为抽象概念,区分于物理连接,与socket类似,是一条通信的管道,管道建立好以后,管道这端发送的数据一定会沿着这条管道到达另一端。
IB中对于面向连接的定义
IBA supports both connection oriented and datagram service. For connected service, each QP is associated with exactly one remote consumer. In this case the QP context is configured with the identity of the remote consumer’s queue pair. … During the communication establishment process, this and other information is exchanged between the two nodes.
意思是,IBA支持基于连接和数据报的服务,对于面向连接的服务来说,每个QP都和另一个远端节点相关联,在这种情况下,QP Context中包含有远端节点的QP信息,在建立通信的时候,两个节点会交换包括稍后用于通信的Qp在内的对端信息。
上面这端描述中的Context一般被翻译成上下文,QP Context(简称QPC)可以简单理解为是记录一个QP相关信息的表格。我们知道QP是两个队列,除了这两个队列之外,我们还需要把关于QP的信息记录到一张表里面,这些信息可能包括队列的深度,队列的编号等等,后面我们会展开讲。

在连接服务类型中的每个QP,都和唯一的另一个QP建立了连接,也就是说QP下发的每个WQE的目的地都是唯一的。
连接的维护依靠在QPC里面的一个记录,在图中为对端来描述,两个节点来连接的时候,会交换稍后用于数据交互的QP Number,然后分别记录在QPC中。
数据报
数据报与连接相反,发端和收端不需要“建立管道”,也不需要节点和QP绑定
For datagram service, a QP is not tied to a single remote consumer, but rather information in the WQE identifies the destination. A communication setup process similar to the connection setup process needs to occur with each destination to exchange that information.
此时在WQE中,就需要指定目的节点,和连接类型的服务一样,建立通信时候也需要两端交换对端信息,但是数据包服务并没有维护所谓的连接,因而每次数据包服务对于每个目的节点都要执行一次交换过程

QP下发给硬件的每个WQE都可能指向不同的目的地
注意:连接和数据包相当于TCP和udp,相当于报文段和数据报的区别
服务类型
上面介绍的两个维度两两组合形成IB的四种基本服务类型

RC和UD是用的最多的也是最基础的两种服务类型,我们可以将其类比为TCP和UDP。
RC用于数据传输可靠性较高场景,和TCP一样,因为需要机制来保证可靠,因而开销较大,由于QP一一绑定,因而在结点较多场景,QP需求量较大,因为QP小号网卡资源或内存,因而存储开销非常大。
UD硬件开销小并且节省存储资源,比如N个节点需要相互通信,只需要创建N个QP即可,但是可靠性和UDP一样没法保证,用户若要实现可靠性,那么需要自己基于IB传输层实现应用层的可靠传输机制。
不同服务类型支持功能
