文章目錄
- 基礎信息
- 建鏈 3次握手
- 斷鏈4次揮手
- 建聯狀態
- active端
- passive端
- 報文結構
- 函數關系
- 其他
- 后記
基礎信息
- CM: Communication Management 通信管理 連接管理
- SIDR: Service ID Resolution Protocol. 作用: enables users of Unreliable Datagram service to locate Queue Pairs supporting their desired service.
- MAD: Management Datagrams 管理報文
- GSI:General Services Interface 通用服務接口
- QP1:專用與rdma cm建鏈
- 分為server端和client端,在RDMA中server端叫passive端(被動)、client端叫active端(主動)
建鏈 3次握手
- req包、rep包、RTU包,rdma中叫做msg
- Request (REQ) message,
- Response (REP) message,
- RTU:Ready To Use。 在內核消息處理中收到該msg之后,會將qp attribute設置RTS和RTR。 read to send ;read to receive
- Queue Pair Number (QPN): QP數字
- EEC: End to End Context 端到端上下文
- req中告訴對端cid、qkey、qpn、guid以及udp的sport
- rep中同樣告訴對端cid(communication id 通信id,相當于session回話的id,每次建聯有一個id)、qkey、qpn。(相當于也是對req的一個ack,同時攜帶自己的信息)
- rtu包含了lcid和rcid表示本地和遠端的cid,算是以此確認。
- 同樣的后面講的dreq中也會攜帶lcid和rcid
斷鏈4次揮手
雙端都需要發送所以累計四次
建聯狀態
active端
passive端
報文結構
- 報文結構:BTH | DETH | MAD header| MAD payload | CRC
- 其中MAD payload,根據消息不同,是不同的消息內容:req、rep、mra、rtu等
- BTH:Base Transport Header:基礎傳輸頭,主要是opcode(比如write 0x10、send 0x4、ack 0x17)、Partition key和目標QP(cm的目標QP都是1),以及報序號
- DETH:Datagram Extended Transport Header:數據報文擴展傳輸頭。主要是query key和source QP。(BTH中是dst qp,deth中是src qp,有點類似以太的smac和dmac。
- MAD:Management Datagrams 管理報文。主要包含Method(是send recv等)、Attribute ID(屬性ID,比如req 0x10、rep 0x13、mra 0x11、rtu 0x14、dreq 0x15、drep 0x16)
- 管理路線:BEM結構 E表示extend,E可以是DETH(數據)、AETH(ack)、RETH(rdma)
- 數據路線:BD結構:BTH頭部和Data的數據比如rdma send數據
- BTH找QP與optype、DETH找sq和key、MAD找attid(比如cm req)、MAD payload找具體的cm msg信息(比如cmd id 等)
函數關系
- 內核中處理msg的發包函數都是ib_send_cm_xxx開頭,比如ib_send_cm_req、ib_send_cm_rep、ib_send_cm_mra、ib_send_cm_rtu…
- 收包函數都是cm_xxx_handler,比如cm_req_handler、cm_rep_handler、cm_rtu_handler、cm_mar_handler、cm_dreq_handler…
- 內核收包處理流程,是ib_cm.ko中調用ib_register_mad_agent注冊cm_recv_handler到mad層進行收包,cm_recv_handler中收到后會啟動一個work,然后通過work event發給內核work上下文進行處理,也就是cm_req_xxx這些函數會在work上下文處理,work的入口函數是cm_work_handler。然后cm_work_handler根據event是req、rep等調用到對應的cm_xxx_handler.
- rdma對應的API調用底層關系是 rdma api -> rdma cm文件(infiniband/rdma_cm) -> 發送write dev函數 -> 內核態ucma處理 -> 內核態rdma接口處理 -> 內核態cma(代理)處理 -> 內核態cm處理 -> 內核態mlnx處理 -> 網卡硬件處理
- 比如rdma_acccpt接口實現就是 打開infiniband/rdma_cm文件,封裝wirte數據命令 CM_CMD_ACCEPT,通過write發送給內核,內核根據cmd的值在ucma_cmd_table中進行match,匹配后調用對應函數ucma_accept函數,然后調用[k] rdma層的rdma_accept、然后調用cm代理cma層的cma_accept,然后繼續往后調用
- rdma_connect會發送req 報文
- rdma_listen會監聽,進入rdma_accept后會發送rep報文或者mra,其他報文類似
- ib_send_cm_xxx最后都會調用ib_post_send_mad發送給mad層,然后mad層調用ib_send_mad調用ib_post_send,然后調用到mlx5_ib_post_send異步發送
其他
- 所有的RoCE v2的報文都會經過UDP,可以通過tcp抓包,但是tcp抓包需要指定端口是mlx5的端口,而不是eth口。
后記
更多細節以后逐漸補充。