【RDMA】librdmacm库和连接建立过程

翻译:rdma_cm - RDMA通信管理器。

概述:rdma_cm是用于建立RDMA传输上的通信的管理器。

说明:RDMA CM是一个用于建立可靠连接和不可靠数据报数据传输的通信管理器。它为建立连接提供了一个RDMA传输中立的接口。该API基于套接字,但为队列对(QP)的语义进行了调整:通信必须通过特定的RDMA设备进行,并且数据传输是基于消息的。

RDMA CM仅提供RDMA API的通信管理(连接建立/拆除)部分。它与libibverbs库定义的verbs API配合使用。libibverbs库提供了发送和接收数据所需的接口。

客户端操作:此部分提供了通信的主动端(或客户端)的基本操作概述。一般的连接流程如下:

  1. rdma_create_event_channel:创建接收事件的通道。

  2. rdma_create_id:分配一个rdma_cm_id,类似于socket。

  3. rdma_resolve_addr:获取本地RDMA设备以到达远程地址。

  4. rdma_get_cm_event:等待RDMA_CM_EVENT_ADDR_RESOLVED事件。

  5. rdma_ack_cm_event:确认事件。

  6. rdma_create_qp:为通信分配一个QP。

  7. rdma_resolve_route:确定到达远程地址的路由。

  8. rdma_get_cm_event:等待RDMA_CM_EVENT_ROUTE_RESOLVED事件。

  9. rdma_ack_cm_event:确认事件。

  10. rdma_connect:连接到远程服务器。

  11. rdma_get_cm_event:等待RDMA_CM_EVENT_ESTABLISHED事件。

  12. rdma_ack_cm_event:确认事件。

  13. 在连接上执行数据传输。

  14. rdma_disconnect:撤销连接。

  15. rdma_get_cm_event:等待RDMA_CM_EVENT_DISCONNECTED事件。

  16. rdma_ack_cm_event:确认事件。

  17. rdma_destroy_qp:销毁QP。

  18. rdma_destroy_id:释放rdma_cm_id。

  19. rdma_destroy_event_channel:释放事件通道。

用于在节点之间建立不可靠数据报(UD)通信的过程几乎相同。但是,QPs之间不会形成实际的连接,因此不需要断开连接。

虽然此示例显示客户端发起断开连接,但连接的任一方都可以发起断开连接。

服务器操作:此部分提供了通信的被动端(或服务器端)的基本操作概述。一般的连接流程如下:

  1. rdma_create_event_channel:创建接收事件的通道。

  2. rdma_create_id:分配一个rdma_cm_id,类似于socket。

  3. rdma_bind_addr:将本地端口号设置为监听的端口号。

  4. rdma_listen:开始监听连接请求。

  5. rdma_get_cm_event:等待带有新的rdma_cm_id的RDMA_CM_EVENT_CONNECT_REQUEST事件。

  6. rdma_create_qp:在新的rdma_cm_id上为通信分配一个QP。

  7. rdma_accept:接受连接请求。

  8. rdma_ack_cm_event:确认事件。

  9. rdma_get_cm_event:等待RDMA_CM_EVENT_ESTABLISHED事件。

  10. rdma_ack_cm_event:确认事件。

  11. 在连接上执行数据传输。

  12. rdma_get_cm_event:等待RDMA_CM_EVENT_DISCONNECTED事件。

  13. rdma_ack_cm_event:确认事件。

  14. rdma_disconnect:撤销连接。

  15. rdma_destroy_qp:销毁QP。

  16. rdma_destroy_id:释放已连接的rdma_cm_id。

  17. rdma_destroy_id:释放监听的rdma_cm_id。

  18. rdma_destroy_event_channel:释放事件通道。

返回值:成功返回0,错误返回-1。如果函数以异步方式运行,则返回值为0表示成功启动操作。操作仍然可能以错误完成;用户应该检查相关事件的状态。如果返回值为-1,则errno将包含有关失败原因的其他信息。

先前版本的库对于与ENOMEM、ENODEV、ENODATA、EINVAL和EADDRNOTAVAIL代码有关的某些情况会返回-errno并且不设置errno。希望检查这些代码并与先前版本的库兼容的应用程序必须在返回代码小于-1时手动将errno设置为返回代码的负值。

相关推荐
caodongwang15 天前
GPU Direct RDMA调研
gpu·rdma·gdr
bandaoyu21 天前
【RDMA】CST=Consistency at Target(目标端一致性操作)
rdma
小辰记事本21 天前
从零读懂网卡内部架构:一条数据包的硬件之旅
网络·网络协议·架构·rdma
小辰记事本22 天前
从零读懂RoCEv2数据包构造:从WQE到线缆上的完整旅程
服务器·网络·网络协议·rdma
小辰记事本1 个月前
RDMA:AI算力集群的“网络命脉”
网络·人工智能·网络协议·rdma
小辰记事本1 个月前
从零读懂RDMA UC Write:单向推送,不求回音
网络·网络协议·rdma
志凌海纳SmartX2 个月前
详解超融合如何让RDMA跨网卡高可用,让高性能业务更可靠
高可用·超融合·rdma·smartx
tiantianuser2 个月前
RDMA设计67: RDMA设计总结
功能测试·rdma·高速传输·cmac·roce v2
tiantianuser2 个月前
RDMA设计63:怎么进行网络嗅探功能测试
网络·fpga开发·rdma·高速传输·cmac·roce v2
tiantianuser2 个月前
RDMA设计64:数据吞吐量性能测试分析
网络·fpga开发·rdma·fpga设计·高速传输·roce v2