首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用RDMA的服务器上的客户端IP地址?

使用 RDMA(Remote Direct Memory Access)技术可以显著提高网络通信的性能,特别是在高性能计算(HPC)和数据中心环境中。RDMA 允许直接从一台计算机的内存访问另一台计算机的内存,而无需经过操作系统的干预,从而减少了延迟和 CPU 负载。

在使用 RDMA 的服务器上获取客户端的 IP 地址,通常涉及以下几个步骤:

  1. 配置 RDMA 环境:确保 RDMA 硬件和软件环境已经正确配置。
  2. 编写 RDMA 应用程序:使用 RDMA 编程接口(如 libibverbs 或 RDMA CM)编写应用程序。
  3. 获取客户端 IP 地址:在 RDMA 连接建立过程中,获取客户端的 IP 地址。

以下是一个使用 RDMA CM(Connection Manager)库的示例,展示了如何在服务器端获取客户端的 IP 地址。

安装 RDMA 库

首先,确保你已经安装了 RDMA 库。你可以使用以下命令在基于 Debian 的系统上安装:

代码语言:javascript
复制
sudo apt-get install rdma-core ibverbs-utils

编写 RDMA 服务器代码

以下是一个简单的 RDMA 服务器示例,展示了如何获取客户端的 IP 地址:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <rdma/rdma_cma.h>

void die(const char *reason) {
    fprintf(stderr, "%s\n", reason);
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv) {
    struct rdma_cm_id *listener = NULL;
    struct rdma_cm_id *client = NULL;
    struct rdma_event_channel *ec = NULL;
    struct rdma_cm_event *event = NULL;
    struct sockaddr_in addr;
    int ret;

    // 创建事件通道
    ec = rdma_create_event_channel();
    if (!ec) die("rdma_create_event_channel failed");

    // 创建 RDMA 监听器
    ret = rdma_create_id(ec, &listener, NULL, RDMA_PS_TCP);
    if (ret) die("rdma_create_id failed");

    // 绑定地址
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(20000); // 监听端口
    addr.sin_addr.s_addr = INADDR_ANY;

    ret = rdma_bind_addr(listener, (struct sockaddr *)&addr);
    if (ret) die("rdma_bind_addr failed");

    // 开始监听
    ret = rdma_listen(listener, 1);
    if (ret) die("rdma_listen failed");

    printf("Server is listening on port 20000...\n");

    // 等待连接请求
    ret = rdma_get_cm_event(ec, &event);
    if (ret) die("rdma_get_cm_event failed");

    if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) {
        client = event->id;

        // 获取客户端地址
        struct sockaddr_in *client_addr = (struct sockaddr_in *)rdma_get_peer_addr(client);
        char client_ip[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &(client_addr->sin_addr), client_ip, INET_ADDRSTRLEN);
        printf("Client connected from IP: %s\n", client_ip);

        // 接受连接
        struct rdma_conn_param conn_param;
        memset(&conn_param, 0, sizeof(conn_param));
        ret = rdma_accept(client, &conn_param);
        if (ret) die("rdma_accept failed");
    }

    // 清理
    rdma_ack_cm_event(event);
    rdma_destroy_id(listener);
    rdma_destroy_event_channel(ec);

    return 0;
}

编译和运行

编译上述代码:

代码语言:javascript
复制
gcc -o rdma_server rdma_server.c -lrdmacm -libverbs

运行服务器:

代码语言:javascript
复制
./rdma_server

解释

  1. 创建事件通道: ec = rdma_create_event_channel(); if (!ec) die("rdma_create_event_channel failed");
  2. 创建 RDMA 监听器: ret = rdma_create_id(ec, &listener, NULL, RDMA_PS_TCP); if (ret) die("rdma_create_id failed");
  3. 绑定地址: memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(20000); // 监听端口 addr.sin_addr.s_addr = INADDR_ANY; ret = rdma_bind_addr(listener, (struct sockaddr *)&addr); if (ret) die("rdma_bind_addr failed");
  4. 开始监听: ret = rdma_listen(listener, 1); if (ret) die("rdma_listen failed");
  5. 等待连接请求: ret = rdma_get_cm_event(ec, &event); if (ret) die("rdma_get_cm_event failed");
  6. 获取客户端地址: if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) { client = event->id; struct sockaddr_in *client_addr = (struct sockaddr_in *)rdma_get_peer_addr(client); char client_ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(client_addr->sin_addr), client_ip, INET_ADDRSTRLEN); printf("Client connected from IP: %s\n", client_ip); struct rdma_conn_param conn_param; memset(&conn_param, 0, sizeof(conn_param)); ret = rdma_accept(client, &conn_param); if (ret) die("rdma_accept failed"); }
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Windows网络服务与配置管理之DHCP服务器搭建

    DHCP的全称为 Dynamic Host Configuration Protocol ,动态主机配置协议。DHCP主要在局域网使用,对IP地址进行集中管理和分配,使网络环境中的主机动态获得IP地址、网关地址、DNS服务器地址等信息,并提升IP地址使用率。 IP地址是每个网络节点的标识,网络中的每一台计算机都需要配置IP地址才能够上网,如果在一些计算机比较固定的场所,例如机房,学习的计算机实验室,这样管理员会手动配置IP地址。如果在办公室,咖啡厅,图书馆,地铁等人口流动大终端不固定的地方,是不可能做到管理员手工配置IP地址的。这样就需要DHCP来分配IP地址和网关、DNS等信息。 DCHP是采用客户端/服务器的通信模式,需要客户端主动向服务器提出请求分配网络配置参数的请求,然后服务器返回客户端分配的IP地址配置信息等。在客户端还没有IP地址的时候,客户端是使用广播请求IP地址等配置信息,DHCP协议采用UDP作为传输协议,客户端发送广播消息到服务器的68端口,服务器响应广播消息给客户端67端口。DHCP客户端从DHCP服务器获取IP地址等信息主要由四个阶段,分别是发现、提供、选择、确认。

    02

    网络虚拟化技术:RDMA技术论文

    分布式系统利用卸载来减少 CPU 负载变得越来越流行。远程直接内存访问 (RDMA) 卸载尤其变得流行。然而,RDMA 仍然需要 CPU 干预来处理超出简单远程内存访问范围的复杂卸载。因此,卸载潜力是有限的,基于 RDMA 的系统通常必须解决这些限制。 我们提出了 RedN,这是一种原则性的、实用的方法,可以实现复杂的 RDMA 卸载,无需任何硬件修改。使用自修改 RDMA 链,我们将现有的 RDMA 动词接口提升为图灵完备的编程抽象集。我们探索使用商用 RDMA NIC 在卸载复杂性和性能方面的可能性。我们展示了如何将这些 RDMA 链集成到应用程序中,例如 Memcached 键值存储,从而使我们能够卸载复杂的任务,例如键查找。与使用单侧 RDMA 原语(例如 FaRM-KV)的最先进的 KV 设计以及传统的 RPC-over-RDMA 方法相比,RedN 可以将键值获取操作的延迟减少高达 2.6 倍。此外,与这些基准相比,RedN 提供性能隔离,并且在存在争用的情况下,可以将延迟减少高达 35 倍,同时为应用程序提供针对操作系统和进程崩溃的故障恢复能力。

    04

    Linux源码分析-RDMA的通信连接管理CM模块

    RDMA CM 是一种通信管理器,用于设置可靠、连接和不可靠的数据报数据传输。 它提供用于建立连接的 RDMA 传输中立接口。 API 概念基于套接字,但适用于基于队列对 (QP) 的语义:通信必须通过特定的 RDMA 设备进行,并且数据传输基于消息。 RDMA CM 可以控制 RDMA API 的 QP 和通信管理(连接建立/拆除)部分,或者仅控制通信管理部分。 它与 libibverbs 库定义的 verbs API 结合使用。 libibverbs 库提供了发送和接收数据所需的底层接口。 RDMA CM 可以异步或同步操作。 用户通过在特定调用中使用 rdma_cm 事件通道参数来控制操作模式。 如果提供了事件通道,rdma_cm 标识符将报告该通道上的事件数据(例如连接结果)。 如果未提供通道,则所选 rdma_cm 标识符的所有 rdma_cm 操作将被阻止,直到完成。 RDMA CM 为不同的 libibverbs 提供商提供了一个选项来宣传和使用特定于该提供商的各种 QP 配置选项。 此功能称为 ECE(增强连接建立)

    01

    ensp实验DHCP配置与原理[通俗易懂]

    为了获取IP地址等配置信息,DHCP客户端需要和DHCP服务器进行报文交互。 首先,DHCP客户端发送DHCP发现报文来发现DHCP服务器。DHCP服务器会选取一个未分配的IP地址,向DHCP客户端发送DHCP提供报文。此报文中包含分配给客户端的IP地址和其他配置信息。如果存在多个DHCP服务器,每个DHCP服务器都会响应。 如果有多个DHCP服务器向DHCP客户端发送DHCP提供报文,DHCP客户端将会选择收到的第一个DHCP提供报文,然后发送DHCP请求报文,报文中包含请求的IP地址。收到DHCP请求报文后,提供该IP地址的DHCP服务器会向DHCP客户端发送一个DHCP确认报文,包含提供的IP地址和其他配置信息。DHCP客户端收到DHCP确认报文后,会发送免费ARP报文,检查网络中是否有其他主机使用分配的IP地址。如果指定时间内没有收到ARP应答,DHCP客户端会使用这个IP地址。如果有主机使用该IP地址,DHCP客户端会向DHCP服务器发送DHCP拒绝报文,通知服务器该IP地址已被占用。然后DHCP客户端会向服务器重新申请一个IP地址。

    02

    DHCP协议原理及应用[通俗易懂]

    DHCP: 动态主机配置协议   TCP/IP协议想要运行正常的话,网络中的主机和路由器不可避免地需要配置一些信息(如接口的IP地址等)。有了这些配置信息主机/路由器才能提供/使用特定的网络服务。   主机信息的必要元素有:IP地址、子网掩码、DNS服务器IP地址   TCP/IP协议配置主机信息主要有三种方法: 1. 手动配置 2. 动态获取 3. 根据特定算法计算。   在网络中,我们把主机分为两大类,服务器主机和客户端主机, + 服务器主机: 一般采用手动配置 + 客户端主机: 一般采用动态获取   服务器一般采用手动配置,而客户端一般动态获取。主要基于以下原因: 1. 客户主机比服务主机移动更频繁 2. 服务主机需要提供更可靠的服务,其配置信息应该减少对其他系统/主机的依赖 3. 客户主机比服务主机的数量要多得多。 4. 客户主机使用者的网络配置知识比服务主机的使用者低

    02

    DHCP介绍及H3C配置DHCP

    1.DHCP引入 (1)简介 DHCP(动态主机设置协议)是一个局域网的网络协议,使用UDP协议工作,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。 (2)功能 a. 保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。 b. DHCP应当可以给用户分配永久固定的IP地址。 c. DHCP应当可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。 d. DHCP服务器应向现有的BOOTP客户端提供服务! (3)分配方式 自动分配方式:DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。 动态分配方式:DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。 3)手工分配方式:客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。 (4)三个端口 a. UDP67: DHCP Server服务端口 b. UDP68: DHCP Client服务端口 c. UDP546: 用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做"双机热备"的. (5)DHCP优缺点 a. DHCP协议主机配置方式最重要的特征就是整个配置过程自动实现,而且所有配置信息在一个地方集中控制,这就是DHCP SERVER的作用。 b. 最初的DHCP协议是在同一个物理子网中使用广播方式实现的,无法穿越路由器扩展到不同的物理子网中,也就是要使用DHCP协议的每一个网络(广播域)中必须配置一台DHCP服务器,为了克服这一缺陷,采用了DHCP RELAY(DHCP中继服务器)的方式使得DHCP协议能够穿越路由器实现。 c. DHCP协议一般采用终端的硬件地址来唯一标识一个终端设备。 d. DHCP协议通过设置IP地址使用租期,可以达到IP地址的分时复用效果,解决IP地址资源短缺的问题。 e. DHCP协议基本上是一个单向驱动协议,SERVER完全是被动的,其动作、行为基本完全由CLIENT的请求行为而激发,即SERVER端无法主动控制CLIENT端。因此其交互性和安全性就没有PPP协议那么完善,这是DHCP协议的一个安全风险点。

    02

    IP地址的分配过程

    IP地址的分配一般分为俩种,手动配置和动态获取。服务器主机一般采用手动配置,而客户端主机(比如我们的手机)采用动态获取。原因有以下几个: 1、 客户主机比服务主机移动更加频繁。2、服务器主机需要提供更可靠的服务,其配置信息应该减少对其他系统/主机的依赖。3、客户主机比服务主机的数量要多很多。4、客户主机使用者的网络配置只是比服务主机的使用者低。 DHCP协议主要分为俩部分,一个是地址管理:处理IP地址的动态分配,向客户端提供地址租约。一个是配置信息的传递:DHCP报文格式、状态机 地址池与地址租约:在IP地址的动态分配中,DHCP客户端想DHCP服务器发送IP地址请求。DHCP服务器会维护一个 IP地址池,DHCP从地址池从取出一个IP回应给DHCP客户端。在地址分配时,DHCP服务器也会指定回应给DHCP客户端的IP地址的租约期,该地址只有在该租约期内可用,不过DHCP客户端可用在租约期内请求延长租约(更新租约期)。

    03

    浏览器输入域名网址访问后的过程详解

    1、客户端浏览器通过DNS解析到https://www.fgba.net/,IP地址是202.108.22.5,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到202.108.22.5,然后通过TCP进行封装数据包,输入到网络层。 2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。 3、客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,无非就是通过查找路由表决定通过那个路径到达服务器。 4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

    00
    领券