RDMA建链的3次握手和断链的4次挥手流程?

文章目录

基础信息

  • 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口。

后记

更多细节以后逐渐补充。

相关推荐
Tassel_YUE4 天前
SmartX分享:SMTX ZBS 中 RDMA 技术简介
分布式存储·rdma·技术分享·块存储·smartx
bandaoyu19 天前
【RDMA】RDMA read和write编程实例(verbs API)
rdma
北冥有鱼被烹1 个月前
微知-DOCA SDK中如何编译一个sample?如何运行?(meson /tmp/xxx; meson compile -C /tmp/xxx)
rdma·dpu·doca
北冥有鱼被烹1 个月前
微知-ib_write_bw的各种参数汇总(-d -q -s -R --run_infinitely)
rdma·mellanox
KIDGINBROOK4 个月前
RDMA驱动学习(一)- 用户态到内核态的过程
rdma
羌俊恩4 个月前
Linux 常见的冷知识集锦
linux·rdma·posix
我想学LINUX5 个月前
【RDMA项目】如何使用rdma-core进行调用开发一个实战项目
服务器·网络·github·客户端·rdma·rdma-core·内存访问
我想学LINUX5 个月前
RDMA 高性能架构基本原理与设计方案
linux·架构·嵌入式·rdma·系统开发·rdma设计思路·rdma基本元素架构
妙BOOK言6 个月前
Rcmp: Reconstructing RDMA-Based Memory Disaggregation via CXL——论文阅读
论文阅读·cxl·rdma·内存分解