【RDMA】5. RDMA基本服务类型
【RDMA】RDMA 學習資料總目錄_bandaoyu的筆記-CSDN博客SavirRDMA 分享1. RDMA概述https://blog.csdn.net/bandaoyu/article/details/112859853https://zhuanlan.zhihu.com/p/1388747382. 比較基于Socket與RDMA的通信https://blog.csdn.net/bandaoyu/article/details/1128613993. RDMA基本元素和編程基礎https://blog.csdn.net/bandaoyu/article/de.https://blog.csdn.net/bandaoyu/article/details/120485737
原文:Savir - https://www.zhihu.com/people/saviour-li/posts
我們在“3. RDMA基本元素”一文中提到過,RDMA的基本通信單元是QP,而基于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通過以下三個機制來保證可靠性:
應答機制
假設A給B發了一個數據包,A怎樣才能知道B收到了呢,自然是B回復一個“我收到了”消息給A。在通信領域我們一般稱這個回復為應答包或者ACK(Acknowledge)。在IB協議的可靠服務類型中,使用了應答機制來保證數據包被對方收到。IB的可靠服務類型中,接收方不是每一個包都必須回復,也可以一次回復多個包的ACK,以后我們再展開討論。
數據校驗機制
這個比較好理解,發端會對Header和Payload(有效載荷,也就是真正要收發的數據)通過一定的算法得到一個校驗值放到數據包的末尾。對端收到數據包后,也會用相同的算法計算出校驗值,然后與數據包中的校驗值比對,如果不一致,說明數據中包含錯誤(一般是鏈路問題導致的),那么接收端就會丟棄這個包,并回復NAK(Not Acknowledge)告知發送端重發。IB協議使用的CRC校驗,本文對CRC不做展開介紹。
保序機制
保序指的是,保證先被發送到物理鏈路上的數據包一定要先于后發送的數據包被接收方收到。有一些業務對數據包的先后順序是有嚴格要求的,比如語音或者視頻。IB協議中有PSN(Packet Sequence Number,包序號)的概念,即每個包都有一個遞增的編號。這樣即使數據包沒有按順序到達收端,接收端也可以按照序號重新組裝有效信息。PSN也可以用來檢測是否丟包,比如收端收到了1和3,在指定時間里但是沒收到2,就回回復一個NAK給發端,讓其重發丟失的包。
不可靠服務,沒有上述這些機制來保證數據包被正確的接收,屬于“發出去就行,我不關心有沒有被收到”的服務類型。
連接與數據報
連接(Connection)在這里指的是一個抽象的邏輯概念,需要區別于物理連接,熟悉Socket的讀者一定對這個其不陌生。連接是一條通信的“管道”,一旦管道建立好了,管道這端發出的數據一定會沿著這條管道到達另一端。
對于“連接”或者說“面向連接”的定義有很多種,有的側重于保證消息順序,有的側重于消息的傳遞路徑唯一,有的強調需要軟硬件開銷來維護連接,有的還和可靠性的概念有交集。本專欄既然是介紹RDMA技術,那么我們就看一下IB協議3.2.2節中對其的描述:
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的信息記錄到一張表里面,這些信息可能包括隊列的深度,隊列的編號等等,后面我們會展開講。
可能還是有點抽象,我們用圖說話:
A、B和A、C節點的網卡在物理上是連接在一起的,A上面的QP2和B上面的QP7、A上面的QP4和B上面的QP2建立了邏輯上的連接,或者說“綁定到了一起”。在連接服務類型中的每個QP,都和唯一的另一個QP建立了連接,也就是說QP下發的每個WQE的目的地都是唯一的。拿上圖來說,對于A的QP2下發的每個WQE,硬件都可以通過QPC得知其目的為B的QP7,就會把組裝好的數據包發送給B,然后B會根據QP7下發的RQ WQE來存放數據;同理,對于A的QP4下發的每個WQE,A的硬件都知道應該把數據發給Node C的QP2。
“連接”是如何維護的呢?其實就是在QPC里面的一個記錄而已。如果A的QP2想斷開與B的QP7的“連接”然后與其他QP相“連接”,只需要修改QPC就可以了。兩個節點在建立連接的過程中,會交換稍后用于數據交互的QP Number,然后分別記錄在QPC中。
數據報(Datagram)與連接相反,發端和收端間不需要“建立管道”的步驟,只要發端到收端物理上是可以到達的,那么我就可能從任何路徑發給任意的收端節點。IB協議對其的定義是這樣的:
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.即“對于數據報服務來說,QP不會跟一個唯一的遠端節點綁定,而是通過WQE來指定目的節點。和連接類型的服務一樣,建立通信的過程也需要兩端交換對端信息,但是數據報服務對于每個目的節點都需要執行一次這個交換過程。”
我們舉個例子:
在數據報類型的QP的Context中,不包含對端信息,即每個QP不跟另一個QP綁定。QP下發給硬件的每個WQE都可能指向不同的目的地。比如節點A的QP2下發的第一個WQE,指示給節點C的QP3發數據;而下一個WQE,可以指示硬件發給節點B的QP7。
與連接服務類型一樣,本端QP可以和哪個對端QP發送數據,是在準備階段提前通過某些方式相互告知的。這也是上文“數據報服務對于每個目的節點都需要執行一次這個交換過程”的含義。
服務類型
上面介紹的兩個維度兩兩組合就形成了IB的四種基本服務類型:
RC和UD是應用最多也是最基礎的兩種服務類型,我們可以將他們分別類比成TCP/IP協議棧傳輸層的TCP和UDP。
RC用于對數據完整性和可靠性要求較高的場景,更TCP一樣,因為需要各種機制來保證可靠,所以開銷自然會大一些。另外由于RC服務類型和每個節點間需要各自維護一個QP,假設有N個節點需要相互通信,那么需要N * (N - 1)個QP,而QP和QPC本身是需要占用網卡資源或者內存的,當節點數很多時,存儲資源消耗將會非常大。
UD硬件開銷小并且節省存儲資源,比如N個節點需要相互通信,只需要創建N個QP就可以了,但是可靠性跟UDP一樣沒法保證。
除此之外,還有RD和UC類型,以及XRC(Extended Reliable Connection)等更復雜的服務類型,我們將在協議解析部分對其進行詳細的描述。
總結
以上是生活随笔為你收集整理的【RDMA】5. RDMA基本服务类型的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Echarts实现X轴拖动显示效果
- 下一篇: 淘晶驰串口屏产品简单介绍
