【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明摘自 Mellanox OFED Linux User Manual v4 1 本章介绍的诊断工具提供了 fabric 中 IB 设备的连接和状态调试方法

大家好,欢迎来到IT知识分享网。

目录

一、抓包命令

tcpdump抓包命令

ibdump 抓包命令

二、RDMA抓包

Mellanox 网卡

1.ibdump

2.tcpdump (docker,Linux内核从4.9以上)

3.tcpdump  (tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

Intel  RDMA网卡

端口镜像方式

在mellanox主机上抓包

抓包过滤

抓包测试

数据收发测试工具:

三、抓包结果文件拆分

边抓包边切割

切割已经爪完成的包

四、抓包结果分析

五、RoCEv2的传输和抓包原理

RDMA抓包


作者:bandaoyu,原始连接:【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

一、抓包命令

tcpdump抓包命令

简介:tcpdump是一个可以根据需求来抓取网络上传输的数据包的工具

常用的命令选项有:

-c:设定抓取的数量

-i:指定监听的网口

-w:将抓取的数据包保存到文件

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-r:读取数据包内容

-C 10: 每10M保存一个包

-G 600:每10分钟保存一个包

过滤的参数规则:

host:指定主机名

net:指定网段

port:指定端口

portrange:指定端口范围

连接运算符

and:所有的条件都满足

or:只要满足一个条件

not:取反,也可以用!

例子:

抓普通包 -i 指示网口

1、抓取主机172.0.0.1的eth0网口的8080、8081端口传输的数据包并保存文件

tcpdump -i eth0 -s0  port 8080 or port 8081 host 172.0.0.1 -w 1.pcap

抓rdma包

对于低于5.1的MLNX_OFED版本,请运行:
#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap

对于MLNX_OFED v5.1及更高版本,运行:
#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

2、按 crtl+c 停止抓包,当前目录会生成一个1.pcap文件

3、简单查看数据包内容

tcpdump -r 1..pcap

注:一般对抓取的数据包用Wireshark工具进行分析

注意:如果您正在使用MLNX_OFED v5.1或更高版本,请确保安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。

​​​​​​​

ibdump 抓包命令

用法:Mellanox Interconnect Communityhttps://community.mellanox.com/s/article/MLNX2-117-2647kn

[root@tuki1 ~]#  ibdump -d mlx5_0 -i 1

二、RDMA抓包

Mellanox 网卡

有三种方法。(抓包:sniffer packet、Packet capture)

1.ibdump

嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。

例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.

  • 编译

Mellanox   github: https://github.com/Mellanox/ibdump

编译报错:ibdump.c:890:30: 错误:‘IBV_FLOW_ATTR_SNIFFER’未声明(在此函数内第一次使用)

则在文件:vim ibdump.c  添加:

#if !defined(IBV_FLOW_ATTR_SNIFFER)
#define IBV_FLOW_ATTR_SNIFFER   3
#endif
具体含义见:https://man7.org/linux/man-pages/man3/ibv_create_flow.3.html

执行:

make WITHOUT_FW_TOOLS=yes
  • 用法

启用步骤:

(实际mlnx.conf提示:

mlx5.conf #根据主机上的实际ib名称创建

2.重新启动驱动程序。

重启网络接口ib0

ifdown ib0
ifup ib0

Mellanox 社区–https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

(更多参数说明见本文后面)

测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/

2.tcpdump (docker,Linux内核从4.9以上)

最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma

使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。

使用方法:

现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)

3、保存捕获结果到文件

tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 

这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-i:指定监听的网口

(更多参数说明见本文后面)

3.tcpdump  (tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

原文:https://docs.mellanox.com/display/MLNXOFEDv/Offloaded+Traffic+Sniffer

ConnectX®-4更高版本的网卡中受支持

Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获

【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明使能Offloaded  Traffic Sniffer:

  1. Turn on the new ethtool private flags “sniffer” (off by default). 

    $ ethtool --set-priv-flags enp130s0f0 sniffer on

  2. 在要监听的以太网接口上设置sniffer 标志后,运行tcpdump捕获该接口上的bypass kernel 流量。

注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。

有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:

(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool–connectx-4-x)

一、前提条件

查看tcpdump和libpcap版本

配置

  • 链路层:以太网
  • 流量:RoCE

二、执行过程

2.使用ethtool启用嗅探器。

注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。

测试完成后,在wireshark中打开文件。
请参阅tcpdump主页(tcpdump(8):https://linux.die.net/man/8/tcpdump)以查看更多示例。

4. 验证RDMA抓包效果(Run RDMA traffic):

在一个服务器上运行

# ib_send_bw

 * Waiting for client to connect... * 

在另外一个服务器上运行:

# ib_send_bw  192.168.5.232  –report_gbits -F

--------------------------------------------------------------------------------------- Send BW Test Dual-port : OFF Device : mlx5_1 Number of qps : 1 Transport type : IB Connection type : RC Using SRQ : OFF TX depth : 128 CQ Moderation : 100 Mtu : 4096[B] Link type : Ethernet Gid index : 0 Max inline data : 0[B] rdma_cm QPs : OFF Data ex. method : Ethernet --------------------------------------------------------------------------------------- local address: LID 0000 QPN 0x01ae PSN 0x31a206 GID: 00:00:00:00:00:00:00:00:00:00:255:255:12:12:12:06 remote address: LID 0000 QPN 0x020a PSN 0xa2824e GID: 00:00:00:00:00:00:00:00:00:00:255:255:12:12:12:05 --------------------------------------------------------------------------------------- #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] 65536 1000 95.16 95.16 0. ---------------------------------------------------------------------------------------

# cat ~/rdma_traffic.txt ... 14:48:23.007280 IP (tos 0x0, ttl 64, id 5066, offset 0, flags [DF], proto UDP (17), length 308) 1.1.6.2.49153 > 1.1.5.2.4791: [no cksum] UDP, length 280 0x0000: 248a 0780 5401 e41d 2df2 a45c 8100 0006 $...T...-..\.... 0x0010: 0800 4500 0134 13ca 4000 4011 18ea 0101 ..E..4..@.@..... 0x0020: 0602 0101 0502 c001 12b7 0120 0000 6440 ..............d@ 0x0030: ffff 0000 0001 0000 002a 8001 0000 0000 .........*...... 0x0040: 0001 0107 0203 0000 0000 0000 0011 7a2f ..............z/ 0x0050: ac19 0010 0000 0000 0000 19ac 2f7a 0000 ............/z.. 0x0060: 0000 0000 0000 0106 4853 e41d 2d03 00f2 ........HS..-... 0x0070: a45c 0000 0000 0000 0000 0001 a400 0000 .\.............. 0x0080: 0000 0000 00b0 28a5 38b7 ffff 37f0 ffff ......(.8...7... 0x0090: ffff 0000 0000 0000 0000 0000 ffff 0101 ................ 0x00a0: 0602 0000 0000 0000 0000 0000 ffff 0101 ................ 0x00b0: 0502 0000 0007 0040 0098 0000 0000 0000 .......@........ 0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x00e0: 0000 0000 0000 0040 b1ee 0000 0000 0000 .......@........ 0x00f0: 0000 0000 0000 0101 0602 0000 0000 0000 ................ 0x0100: 0000 0000 0000 0101 0502 0000 0000 0000 ................ 0x0110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0140: 0000 5870 f2dd ..Xp..

Intel  RDMA网卡

intel主机侧的抓包工具仍然在开发中,目前(2022-10)只能通过在交换机上or交换机镜像到主机上来抓包。或者 通过和mellanox网卡通信,在mellanox主机上抓包

端口镜像方式

使用tcpdump捕获RDMA流量

———————————–

RDMA通信绕过内核,Linux的tcpdump 通常不可用。您可以通过在交换机上使用端口镜像来使用tcpdump捕获RDMA通信。

在mellanox主机上抓包

intel RDMA网卡的主机和 mellanox网卡的主机通信,在mellanox网卡的主机上抓包

抓包过滤

在这里插入图片描述
然后我们另开一个shell 用tcpdump抓包:sudo tcpdump -v -i eth0 ‘ip[1]&0xfc == 40’,ip[1] 是过滤IP包头的第2个字节,0xfc相当于掩码忽略掉后两位ECN位。

在这里插入图片描述

这样就可以抓到AF11的包,对应上表DSCP值10[0x0a],TOS值40[0x28]。

在这里插入图片描述

抓包测试

perftest工具

https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

ib_send_bw/ib_write_bw

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 -vv

测试SEND模式

–tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

实战

  1. 使能Offloaded  Traffic Sniffer:

 [root@rdma63 tcpdump]# ifconfig  找到两张IB网卡

  

为方便,将两个网卡都使能

$ ethtool –set-priv-flags ib18-0 sniffer on
$ ethtool –set-priv-flags ib3b-0 sniffer on

  1. 运行监听工具tcpdump

我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp  消息。

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 -vv

  1. 运行server和client

查询IB卡与网口对应关系:

[root@rdma63 dscp]# ibdev2netdev

RDMA Qos note

日期

变更人

版本

备注


数据收发测试工具:

【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

三、抓包结果文件拆分

抓的包太大,怎么拆分成多个文件呢?

边抓包边切割

常用的命令选项有:

-c:设定抓取的数量

-i:指定监听的网口

-w:将抓取的数据包保存到文件

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-r:读取数据包内容

-C 10: 每10M保存一个包

-G 600:每10分钟保存一个包

割已经爪完成的包

就是从已经捕获的文件读取,然后再另存成新文件,并且每个文件大小是1000M(不过不是1G,是1000M个字节)

四、抓包结果分析

【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

五、RoCEv2的传输和抓包原理

  1. 当RDMA数据包通过以太网到达并被RDMA网卡接收时,理论上,与RDMA传输相关的数据包处理(包括IP和UDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,而不需要操作系统内核的介入。
  2. 在RoCE使用场景中,RDMA网卡负责执行与RDMA传输相关的大部分工作,包括解析数据包、执行DMA操作将数据直接传输到目标内存等,绕过传统的CPU处理和操作系统内核,由RDMA网卡的硬件完成的。

因此,RoCE技术的关键优势之一就是能够在硬件级别上实现数据包的处理和传输,从而绕过操作系统内核,减少延迟和CPU开销。然而,这并不意味着操作系统和其网络协议栈在整个过程中没有任何角色。在一些场景下(如配置、初始化RDMA连接、处理非数据传输的管理报文等),操作系统和内核网络栈可能仍然需要参与,但是对于数据平面的高速数据传输(核心RDMA数据传输路径),主要是通过RDMA硬件和相关硬件逻辑来实现的。

在使用RoCEv2的情况下,RDMA 网卡在DMA数据到目的网卡的时候,数据包是什么格式/协议?

首先,RoCEv2是基于以太网的RDMA协议,它利用以太网作为传输介质。因此,数据包的基本格式是以太网帧。帧头包含源和目标MAC地址,以及类型字段,用于标识帧的协议类型。数据载荷就是RDMA请求或响应。

其次,RoCEv2数据包在以太网帧内部使用UDP(用户数据报协议)作为传输层协议。UDP为数据包提供了端口号,使得源和目标主机能够正确识别和处理数据包。RoCEv2的UDP使用4791作为默认端口。

在RoCEv2数据包中数据载荷就是RDMA请求或响应:RDMA相关的头部信息,如操作类型、目标队列对(QP)号、序列号等。

【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

 

【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

 

RDMA网卡数据包处理(包括IPUDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,当解析到载荷数据不是RDMA数据时,是不是就把数据包传递给内核的IP/TCP协议栈处理?

是的,

RDMA数据传输:当网卡检测到传入的数据包是RDMA协议的一部分(例如,使用特定的UDP端口和协议标识符),它会按照RDMA的方式处理这些数据,利用硬件加速路径直接在网卡和应用程序之间传输数据,绕过传统的内核网络栈。这样可以提供极低的延迟和高带宽,适用于高性能计算和存储网络。

非RDMA数据传输:当网卡检测到传入的数据包不属于RDMA操作(即,数据载荷不是RDMA数据时),如常规的IP数据包,这些包会被传递给操作系统的网络协议栈进行处理。

RoCE数据包处理(包括IPUDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,而不需要操作系统内核的介入。是不是意味着,RDMA网卡的固件也需要实现IP/TCP协议栈?

确实,对于RDMA over Converged Ethernet(RoCEv2)这类情况,RDMA网卡的固件需要能够处理一定层面上的IP和UDP协议功能,尽管这不是一个完整的传统意义上的TCP/IP协议栈。

总的来说,RDMA网卡并不需要具备一个完整的TCP/IP协议栈,但它确实需要实现那些直接相关于其数据包协议(在RoCEv2的情况下是IP和UDP)的基础处理能力。

 

 

RoCE数据包处理(包括IPUDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,而不需要操作系统内核的介入,那运行在linux上的tcpdump是如何抓取到RoCEv2数据包的?

首先,tcpdump是一个强大的网络数据包分析工具,它基于网卡抓取流动在网卡上的数据包。在Linux系统中,tcpdump通过直接访问网络接口(如RDMA网卡)来捕获数据包。这意味着,尽管RDMA网卡内部进行了复杂的数据处理,但数据包在通过网络接口发送或接收时,tcpdump仍然能够捕获到它们。

其次,当RDMA网卡通过DMA(直接内存访问)技术将数据直接传输到应用程序的内存时,这些数据包在传输过程中仍然会经过网络接口。这意味着,尽管DMA操作绕过了CPU和操作系统内核,但数据包本身仍然会在网络接口层面可见。

说白了,就是tcpdump 直接读取网卡的缓存堆栈等抓取数据.

在Linux系统上,tcpdump 能够捕获到RoCEv2数据包的主要原因是这些数据包仍然遵循标准的以太网、IP和UDP协议封装。尽管RDMA数据包的处理和传输是在RDMA网卡的内部专用处理器或硬件逻辑上执行的,但在网络层面上,这些数据包仍然是标准的网络帧和报文。

这是怎么做到的:

  1. 网络接口的监听:tcpdump 工作在网络接口层级,利用Linux操作系统提供的包捕获接口(如libpcap库)来监听网络接口上的数据流。当数据包通过网络接口时,无论其内容是什么,tcpdump 都能捕捉到这些以太网帧。
  2. 标准协议封装:RoCEv2数据包使用标准的以太网帧封装,内含IP和UDP头部,因此这些数据包在物理层和链路层看起来与其他类型的网络流量(如HTTP或FTP)没什么不同。tcpdump 通过分析这些头部信息,可以辨认出特定的RoCEv2流量。
  3. RoCEv2识别:tcpdump 可以根据IP和UDP的头信息,如目的端口号,来识别出RoCEv2数据流。RoCEv2通信通常使用特定的端口号,tcpdump 可以配置过滤规则来只捕获特定端口的通信,从而实现对RoCEv2数据包的捕获。
  4. 网络堆栈的透明度:尽管RDMA操作旨在绕过操作系统的网络堆栈以减少延迟和提高效率,但这种操作的精确方式(尤其在数据包接收和发送时)并不妨碍使用网络监控工具(如tcpdump)在网络层(特别是在数据包进出网络接口的时刻)进行监控。因为这些工具操作在较低层次的网络接口级别,使得它们能够捕获到通过网络接口的所有数据包,包括RoCEv2数据包。

因此,即使RDMA数据传输的细节是在网卡的硬件中处理的,tcpdump 这类工具仍然能够通过捕获和分析网络接口上的数据流来监视这些传输。这为网络管理员和系统管理员提供了一种强大的工具,以监控和调试RDMA和其他类型的网络流量。

在网络接口层级上监听数据流来捕获数据包。 怎么理解这句话?

 

这句话指的是在计算机网络通信中,有一层专门负责处理数据包的传输和接收,即网络接口层。在这个层级上,网络接口会接收来自网络的数据流,并将其传递给操作系统的网络协议栈进行处理。同时,它也会将操作系统要发送的数据包传输到网络中。

当我们说在网络接口层级上监听数据流时,意味着某个软件或工具(比如 tcpdump)会在这个网络接口层级上监视网络通信的数据流。它可以实时地获取从网络中接收到的数据包,并且也能够捕获操作系统要发送的数据包。

因此,通过在网络接口层级上监听数据流,tcpdump 就能够捕获通过这个网络接口传输的数据包,从而实现了对网络通信的监控和分析。

RDMA 用什么抓包工具分析帧? – 知乎 (zhihu.com)

 

=========================草稿======================

RDMA抓包

    1. ibdump

嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。

例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.

用法

启用步骤:

1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:

options mlx4_core log_num_mgm_entry_size = -1:

(实际mlnx.conf提示:

Please don’t edit this file. Create a new file under

# /etc/modprobe.d/ for your configurations.

所以在/etc/modprobe.d/下创建:

mlx5.conf #根据主机上的实际ib名称创建

options mlx4_core log_num_mgm_entry_size = -1:

options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句

2.重新启动驱动程序。

.重启网络接口ib0

ifdown ib0

ifup ib0

注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。

https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

服务端:

ib_write_bw -d mlx5_1  #监听mlx5_1 网卡

ib_write_bw  182.205.31.53  –report_gbits -F #客户端

测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/

ibdump github: https://github.com/Mellanox/ibdump

注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包

    1. tcpdump (docker,Linux内核从4.9以上)

最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma

(查看内核版本命令:uname -r、uname -a、lsb_release -a)

但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。

使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。

使用方法:

1、拉取容器:

docker pull mellanox / tcpdump-rdma

2、启动容器

docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces –net=host –privileged

现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)

3、保存捕获结果到文件

tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 

这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。

    1. tcpdump (Offloaded Traffic Sniffer,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

原文:https://docs.mellanox.com/display/MLNXOFEDv/Offloaded+Traffic+Sniffer

在ConnectX®-4和更高版本的网卡中受支持。

Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获

  1. 使能Offloaded  Traffic Sniffer:

Turn on the new ethtool private flags “sniffer” (off by default). 

$ ethtool –set-priv-flags enp130s0f0 sniffer on

(在运行tcpdump的主机上)

  1. 在要监听的以太网接口上设置sniffer 标志后,运行tcpdump捕获该接口上的bypass kernel 流量。

注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。

有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:

(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool–connectx-4-x)

一、前提条件

设置

注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。

在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。

查看tcpdump和libpcap版本

[root@rdma63 dscp]# tcpdump –help

tcpdump version 4.9.2

libpcap version 1.5.3

配置

链路层:以太网

流量:RoCE

二、执行过程

1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。

2.使用ethtool启用嗅探器。

在此示例中,网卡名称为ens785f0

# ethtool –set-priv-flags ens785f0 sniffer on

注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。

3.运行tcpdump等待数据包

对于低于5.1的MLNX_OFED版本,请运行:

#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap

对于MLNX_OFED v5.1及更高版本,运行:

#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

 ./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.54 -i ib3b-0 -vv

(抓取网卡ib3b-0 172.17.31.54 172.17.31.54 之间的udp数据包)

测试完成后,在wireshark中打开文件。

请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。

 备注:使用过程中,发现加了port过滤后,抓不到RDMA

Tcpdump 抓到的包的tos更像是dscp的值

    1. 验证RDMA抓包效果(Run RDMA traffic):
      1. ib_send_bw/ib_write_bw

测试SEND模式

在一个服务器上运行

# ib_send_bw

在另外一个服务器上运行:

# ib_send_bw  192.168.5.232  –report_gbits -F

测试WRITE模式

在一个服务器上运行

# ib_write_bw

在另外一个服务器上运行:

# ib_write_bw  192.168.5.232  –report_gbits -F

5.检查输出文件。

在此示例中,UDP端口4791用于RoCEv2通信。

# cat ~/rdma_traffic.txt

如果您将文件保存给Wireshark,则会收到以下消息:

“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”

设置tos

服务端:

ib_send_bw -d mlx5_1 –rdma_cm

客户端:

ib_send_bw 172.17.31.53 –tos=0x04 -R

      1.  bv_xxx_pingpong

使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:

RDMA抓包

    1. ibdump

嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。

例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.

用法

启用步骤:

1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:

options mlx4_core log_num_mgm_entry_size = -1:

(实际mlnx.conf提示:

Please don’t edit this file. Create a new file under

# /etc/modprobe.d/ for your configurations.

所以在/etc/modprobe.d/下创建:

mlx5.conf #根据主机上的实际ib名称创建

options mlx4_core log_num_mgm_entry_size = -1:

options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句

2.重新启动驱动程序。

.重启网络接口ib0

ifdown ib0

ifup ib0

注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。

https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

服务端:

ib_write_bw -d mlx5_1  #监听mlx5_1 网卡

ib_write_bw  182.205.31.53  –report_gbits -F #客户端

测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/

ibdump github: https://github.com/Mellanox/ibdump

    1. tcpdump (docker,Linux内核从4.9以上)

最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma

(查看内核版本命令:uname -r、uname -a、lsb_release -a)

但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。

使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。

使用方法:

1、拉取容器:

docker pull mellanox / tcpdump-rdma

2、启动容器

docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces –net=host –privileged

现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)

3、保存捕获结果到文件

tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 

这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。

    1. tcpdump (Offloaded Traffic Sniffer,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

原文:https://docs.mellanox.com/display/MLNXOFEDv/Offloaded+Traffic+Sniffer

在ConnectX®-4和更高版本的网卡中受支持。

Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获

  1. 使能Offloaded  Traffic Sniffer:

Turn on the new ethtool private flags “sniffer” (off by default). 

$ ethtool –set-priv-flags enp130s0f0 sniffer on

(在运行tcpdump的主机上)

  1. 在要监听的以太网接口上设置sniffer 标志后,运行tcpdump捕获该接口上的bypass kernel 流量。

注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。

有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:

(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool–connectx-4-x)

一、前提条件

设置

注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。

在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。

查看tcpdump和libpcap版本

[root@rdma63 dscp]# tcpdump –help

tcpdump version 4.9.2

libpcap version 1.5.3

配置

链路层:以太网

流量:RoCE

二、执行过程

1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。

2.使用ethtool启用嗅探器。

在此示例中,网卡名称为ens785f0

# ethtool –set-priv-flags ens785f0 sniffer on

注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。

3.运行tcpdump等待数据包

对于低于5.1的MLNX_OFED版本,请运行:

#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap

对于MLNX_OFED v5.1及更高版本,运行:

#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

*.pcap文件用wireshark打开。

 ./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.54 -i ib3b-0 -vv

(抓取网卡ib3b-0 172.17.31.54 172.17.31.54 之间的udp数据包,只有SEND的时候走IP,能识别为UDP包,当使用WRITE/READ时,不走IP,走的是GID,所以tcpdump不能使用ipudp过滤,否则就把RDMA包给过滤了)

测试完成后,在wireshark中打开文件。

请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。

Tcpdump 抓到的包的tos更像是dscp的值

    1. 验证RDMA抓包效果(Run RDMA traffic):
      1. ib_send_bw/ib_write_bw

测试SEND模式

在一个服务器上运行

# ib_send_bw

在另外一个服务器上运行:

# ib_send_bw  192.168.5.232  –report_gbits -F

测试WRITE模式

在一个服务器上运行

# ib_write_bw

在另外一个服务器上运行:

# ib_write_bw  192.168.5.232  –report_gbits -F

5.检查输出文件。

在此示例中,UDP端口4791用于RoCEv2通信。

# cat ~/rdma_traffic.txt

如果您将文件保存给Wireshark,则会收到以下消息:

“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”

设置tos

服务端:

ib_send_bw -d mlx5_1 –rdma_cm

客户端:

ib_send_bw 172.17.31.53 –tos=0x04 -R

      1.  bv_xxx_pingpong

使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:

# 在服务端

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1

  local address:  LID 0x000c, QPN 0x000a19, PSN 0xf31d1e, GID fe80::e41d:2d03:50:e831

  remote address: LID 0x000e, QPN 0x000491, PSN 0xfefc9e, GID fe80::e41d:2d03:50:e801

bytes in 0.01 seconds = 11821.07 Mbit/sec

1000 iters in 0.01 seconds = 5.54 usec/iter

#在客户端 192.168.10.27是服务端的地址

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1 192.168.10.27

  local address:  LID 0x000e, QPN 0x000491, PSN 0xfefc9e, GID fe80::e41d:2d03:50:e801

  remote address: LID 0x000c, QPN 0x000a19, PSN 0xf31d1e, GID fe80::e41d:2d03:50:e831

bytes in 0.01 seconds = 11797.66 Mbit/sec

1000 iters in 0.01 seconds = 5.55 usec/iter

说明ibv_rc_pingpong Command – Sun Datacenter InfiniBand Switch 648 Topic Set

      1. rdma_server

服务器端运行:

rdma_server    #默认端口是7471

客户端运行:

rdma_client  -s 服务端IP

帮助:man  rdma_server

      1. ib_send_bw/ib_write_bw 发送Qos的数据包

用ibdump监听:

./ibdump -d mlx5_1

ib_send_bw要支持Qos需要加–rdma_cm

服务端:

ib_send_bw -d mlx5_1   –rdma_cm

客户端:

ib_send_bw 172.17.31.53 –tos=0x04 –R

–tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=、、、,即64、65、66、67

    1. 远程捕获交换机数据包

交换机需要安装Packet Capture

:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

过程:

  1. 配置Device 交换机

# FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014

<Device> packet-capture remote interface fortygige 1/0/1 port 2014

语法:

packet-capture remote interface interface-type interface-number [ port port ]

interface-type 查询命令:

display interface

dis int

packet-capture stop 停止服务

(2)     配置Wireshark

a.     PC上打开Wireshark软件,选择“Capture > Options”

b.     选择“Interface > Remote”

c.     输入DeviceIP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014

d.     点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。

更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

    1. 抓包记录
      1. tcpdump -Offloaded Traffic Sniffer

在53机器上:

ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

  1. 使能Offloaded  Traffic Sniffer:

   [root@rdma63 tcpdump]# ifconfig  找到两张IB网卡

ib18-0: 192.169.31.53

ib3b-0: 172.17.31.53

  

为方便,将两个网卡都使能

$ ethtool –set-priv-flags ib18-0 sniffer on

$ ethtool –set-priv-flags ib3b-0 sniffer on

  1. 运行监听工具tcpdump

我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp  消息。

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 –vv

RMDA write的时候用的不是IP,用的是GID,所以不能用IP过滤)

  1. 运行server和client

查询IB卡与网口对应关系:

[root@rdma63 dscp]# ibdev2netdev

mlx5_0 port 1 ==> ib18-0 (Up)

mlx5_1 port 1 ==> ib3b-0 (Up)

我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以

53(172.17.31.53)上运行server:

ib_write_bw -d mlx5_1 

54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):

ib_write_bw 172.17.31.53

用ibdump监听:

./ibdump -d mlx5_1

服务端:

ib_send_bw -d mlx5_1   –rdma_cm

客户端:

ib_send_bw 172.17.31.53 –tos=0x04 –R

–tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=、、、,即64、65、66、67

      1. rdma_server

服务器端运行:

rdma_server    #默认端口是7471

客户端运行:

rdma_client  -s 服务端IP

帮助:man  rdma_server

      1. ib_send_bw/ib_write_bw 发送Qos的数据包

用ibdump监听:

./ibdump -d mlx5_1

ib_send_bw要支持Qos需要加–rdma_cm

服务端:

ib_send_bw -d mlx5_1   –rdma_cm

客户端:

ib_send_bw 172.17.31.53 –tos=0x04 –R

–tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=、、、,即64、65、66、67

    1. 远程捕获交换机数据包

交换机需要安装Packet Capture

:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

1-1 远程报文捕获组网图

过程:

  1. 配置Device 交换机

# FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014

<Device> packet-capture remote interface fortygige 1/0/1 port 2014

语法:

packet-capture remote interface interface-type interface-number [ port port ]

interface-type 查询命令:

display interface

dis int

packet-capture stop 停止服务

(2)     配置Wireshark

a.     PC上打开Wireshark软件,选择“Capture > Options”

b.     选择“Interface > Remote”

c.     输入DeviceIP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014

d.     点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。

更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

    1. 抓包记录
      1. tcpdump -Offloaded Traffic Sniffer

在53机器上:

ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

  1. 使能Offloaded  Traffic Sniffer:

   [root@rdma63 tcpdump]# ifconfig  找到两张IB网卡

ib18-0: 192.169.31.53

ib3b-0: 172.17.31.53

  

为方便,将两个网卡都使能

$ ethtool –set-priv-flags ib18-0 sniffer on

$ ethtool –set-priv-flags ib3b-0 sniffer on

  1. 运行监听工具tcpdump

我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp  消息。

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 –vv

  1. 运行server和client

查询IB卡与网口对应关系:

[root@rdma63 dscp]# ibdev2netdev

mlx5_0 port 1 ==> ib18-0 (Up)

mlx5_1 port 1 ==> ib3b-0 (Up)

我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以

53(172.17.31.53)上运行server:

ib_write_bw -d mlx5_1 

54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):

ib_write_bw 172.17.31.53

用ibdump监听:

./ibdump -d mlx5_1

服务端:

ib_send_bw -d mlx5_1   –rdma_cm

客户端:

ib_send_bw 172.17.31.53 –tos=0x04 –R

–tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=、、、,即64、65、66、67

过滤:—-注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包

源主机是:172.17.31.54、目标主机是:172.17.31.53 目标端口是:12345 的数据

./tcpdump src host 172.17.31.54 and dst host 172.17.31.53 and dst port 12345  -i ib3b-0 -vv

协议是UDP 源主机是:172.17.31.54、目标主机是:172.17.31.53 目标端口是:12345 的数据

./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 and dst port 12345  -i ib3b-0 -vv

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1 -p 12345

ibv_rc_pingpong -g 0  -i 1 172.17.31.53 -p 12345

OPCODE                      | IBV_QPT_UD | IBV_QPT_UC | IBV_QPT_RC

—————————-+————+————+———–

IBV_WR_SEND                 |     X      |     X      |     X

IBV_WR_SEND_WITH_IMM        |     X      |     X      |     X

IBV_WR_RDMA_WRITE           |            |     X      |     X

IBV_WR_RDMA_WRITE_WITH_IMM  |            |     X      |     X

IBV_WR_RDMA_READ            |            |            |     X

IBV_WR_ATOMIC_CMP_AND_SWP   |            |            |     X

IBV_WR_ATOMIC_FETCH_AND_ADD |            |            |     X

ibv_post_send(3) – Linux manual page

rdma_cm

/* Connection types available. */

#define RC  (0)

#define UC  (1)

#define UD  (2)

#define RawEth  (3)

#define XRC (4)

#define DC  (5)

#define SRD (6)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/109822.html

(0)
上一篇 2026-02-04 14:21
下一篇 2026-02-04 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信