--- tags: Session one --- # RDMA send/receive和write/read(葉鎮邦) ### RDMA send/receive(SEND/RECV) SEND和RECV是兩種不同的操作類型,但是如果一端進行SEND操作,對端必須進行RECV操作,所以通常都把他們放到一起描述, 上層應用通過WQE(WR)來給硬體下任務。在SEND-RECV操作中,不止發送端(SEND)需要下發WQE,接收端(RECEIVE)也需要下發WQE來告訴硬體收到的數據需要放到哪個地址,並且RECEIVE要先於SEND執行,這和傳統的TCP/IP相似,區別在於RDMA的Zero Copy、kernel bypass和low latency(低延遲) ![](https://pic1.zhimg.com/80/v2-0cf9762c0375f4294075a5510b314a80_720w.jpg) (圖中順序不一定為實際順序) ### RDMA write/read WRITE/READ是**單邊操作**,多用於批量數據傳輸,讀/寫操作是一方在執行,在實際的通信過程中,WRITE/READ操作是由客戶端(client)來執行的,而伺服器(server)不需要執行任何操作。 - **RDMA write**:由客戶端把數據從本地buffer中直接寫入遠端的記憶體中,為此需要知道目的地址(remote_addr)和訪問權限(remote_key),而這兩樣資訊則通常是透過**RDMA send/receive**獲得。 ![](https://pic3.zhimg.com/80/v2-95cdf471e117f8dccfee7e7115885c46_720w.jpg) 1. 請求端(Request)APP以WQE(WR)的形式下發一次WRITE任務。 2. 請求端硬體從SQ中取出WQE,解析信息。 3. 請求端網路卡(NIC)根據WQE中的虛擬地址(VA),轉換得到實體地址,然後從記憶體中拿到待發送數據,組裝封包。 4. 請求端網路卡將封包通過實體層(physical layer)發送給響應端(Respnder)網路卡。 5. 響應端收到封包,解析目的虛擬地址,轉換成本地實體地址,解析數據,將數據放置到指定記憶體區域。 6. 響應端回复ACK報文給請求端。 7. 請求端網路卡收到ACK後,生成CQE,放置到CQ中。 8. 請求端APP取得任務完成信息。 - **RDMA read**:是客戶端直接到遠程的QP的虛擬空間的連續記憶體塊中獲取數據poll到本地目的buffer中,因此需要遠程QP的記憶體地址和訪問權限。 ![](https://pic1.zhimg.com/80/v2-3e576043a6b1a1e12993d0a813320768_720w.jpg) 1. 請求端(Request)APP以WQE的形式下發一次READ任務。 2. 請求端網路卡(NIC)從SQ中取出WQE,解析信息。 3. 請求端網路卡將READ請求包通過實體層(physical layer)發送給響應端(Respnder)網路卡。 4. 響應端收到封包,解析目的虛擬地址(VA),轉換成本地實體地址,解析數據,從指定記憶體區域取出數據。 5. 響應端硬體將數據組裝成回複封包發送到實體層。 6. 請求端硬體收到封包,解析提取出數據後放到READ WQE指定的記憶體區域中。 7. 請求端網路卡生成CQE,放置到CQ中。 8. 請求端APP取得任務完成信息。 | send/receive| write/read | | -------- | -------- | | 雙邊操作 | 單邊操作 | | 通常只用來交換一些簡單的控制信息 | 用於批量數據的傳送 | 來源:[RDMA之操作](https://zhuanlan.zhihu.com/p/142175657)