您的位置:首页 > 汽车 > 新车 > RDMA建链的3次握手和断链的4次挥手流程?

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

2024/7/3 10:37:51 来源:https://blog.csdn.net/essencelite/article/details/139972582  浏览:    关键词:RDMA建链的3次握手和断链的4次挥手流程?

文章目录

  • 基础信息
  • 建链 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口。

后记

更多细节以后逐渐补充。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com