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 re
<think>嗯,用户问的是如何使用RDMA Connection Manager立连接。首先,我需要回忆一下RDMA的基本概念相关库。RDMA(远程直接内存访问)允许直接访问远程内存,无需操作系统介入,这对高性能计算很重要。RDMA CM(连接管理器)是用于管理连接终止的库,属于rdma-core项目的一部分。用户提供的引用中提到了rdmacm_utils.py一些基本操作步骤,还有官方文档的议,这应该能帮助我构回答。 首先,RDMA连接通常分为主动端(客户端)被动端(服务器端)。我需要分步骤说明双方的流程。根据引用[2][4],需要掌握基本概念并参考官方文档。步骤可能包括创ID、解析地址、监听/连接、交换QP信息等。 然后,引用[5]提到了准备数据缓冲区、设置地址密钥,这可能涉及内存注册QP的操作。但立连接阶段可能更关注于CM的操作,而不是数据传输的具体步骤。需要区分连接数据传输的不同阶段。 在代码示例方面,虽然用户提供的引用中有Python的示例,但RDMA通常用C语言实现,所以可能需要给出C的代码片段。例如,使用rdma_create_event_channel、rdma_create_id等函数。但用户引用的引用[1]提到了rdmacm_utils.py,可能用户对Python实现也有兴趣,但根据引用[4],官方文档示例代码可能更偏向C语言,所以需要确认。 另外,需要注意用户提到的引用[3]中的rdma_post_read函数属于数据传输阶段,可能在连接立之后才会用到。立连接的关键步骤包括事件处理、地址解析交换连接参数。 可能的问题点:如何创事件通道、绑定地址、处理连接事件。服务器端需要监听,客户端需要发起连接请求。交换QP信息(如地址rkey)可能需要通过带外方式传输,比如TCP套接字,这部分可能需要用户自己实现,如引用[4]议参考官方示例。 总结步骤: 1. 创事件通道ID。 2. 解析目标地址端口。 3. 绑定地址并监听(服务器)或连接(客户端)。 4. 处理连接事件,立QP。 5. 交换必要的元数据。 6. 连接就绪后进行数据传输。 同时,需要提醒用户注意内存注册错误处理,以及需要具备的背景知识,如引用[4]提到的网络系统编程基础。 可能的相关问题包括如何优化连接立过程、处理多连接,或者如何在实际应用中使用RDMA CM,比如在分布式存储或HPC中的应用。需要确保回答结构清晰,分步骤说明,并引用提供的资料。</think>### 如何使用 RDMA Connection Manager 立连接 RDMA Connection Manager (RDMA_CM) 是 rdma-core 库中用于管理 RDMA 连接的核心组件,支持基于事件驱动的连接终止。以下是立连接的核心步骤: --- #### **1. 初始化通信环境** - **创事件通道** 通过 `rdma_create_event_channel()` 创事件通道,用于监听连接事件(如连接请求、完成事件)[^4]。 ```c struct rdma_event_channel *ec = rdma_create_event_channel(); ``` - **创标识符 (ID)** 使用 `rdma_create_id()` 创 RDMA 标识符,指定通信类型(如 `AF_IB` 或 `AF_INET`)。 ```c struct rdma_cm_id *id; rdma_create_id(ec, &id, NULL, RDMA_PS_TCP); ``` --- #### **2. 地址解析与绑定** - **服务器端(被动端)** - 绑定到指定端口: ```c rdma_bind_addr(id, (struct sockaddr *)&addr); // addr 包含 IP 端口 ``` - 进入监听状态: ```c rdma_listen(id, 5); // 设置最大等待连接数 ``` - **客户端(主动端)** - 解析目标地址: ```c rdma_resolve_addr(id, NULL, (struct sockaddr *)&dst_addr, TIMEOUT_MS); ``` - 发起连接请求: ```c rdma_connect(id, &conn_param); // conn_param 包含连接参数 ``` --- #### **3. 处理连接事件** - **事件循环** 通过 `rdma_get_cm_event()` 监听事件(如 `RDMA_CM_EVENT_CONNECT_REQUEST`)并响应: ```c struct rdma_cm_event *event; rdma_get_cm_event(ec, &event); switch (event->event) { case RDMA_CM_EVENT_CONNECT_REQUEST: // 接受连接请求 rdma_accept(event->id, &conn_param); break; case RDMA_CM_EVENT_ESTABLISHED: // 连接就绪,可开始数据传输 break; } ``` --- #### **4. 交换元数据** 连接立后,需通过带外方式(如 TCP)交换以下信息[^5]: - 远程内存地址 (`addr`) 访问密钥 (`rkey`) - 队列对 (QP) 的上下文信息 --- #### **代码示例(简化流程)** ```c // 服务器端 struct rdma_cm_id *listen_id; rdma_bind_addr(listen_id, addr); rdma_listen(listen_id, 5); // 客户端 struct rdma_cm_id *conn_id; rdma_resolve_addr(conn_id, NULL, dst_addr, 2000); rdma_connect(conn_id, &conn_param); ``` --- #### **注意事项** 1. **内存注册** 在数据传输前,需通过 `ibv_reg_mr()` 注册内存缓冲区并获取本地内存描述符 (MR)[^5]。 2. **错误处理** 所有 RDMA_CM 函数需检查返回值,并调用 `rdma_destroy_id()` 释放资源。 3. **背景知识** 需熟悉 InfiniBand 架构 Linux 系统编程[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值