目录
2.tcpdump (docker,Linux内核从4.9以上)
3.tcpdump (tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
作者:bandaoyu,原始连接:https://blog.csdn.net/bandaoyu/article/details/115791233
一、抓包命令
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 抓包命令
[root @ rdma64 ibdump-master]#ibdump -h
ibdump-dump Mellanox Technologies ConnectX 网卡的 Infiniband 数据包
可以生成文件给Wireshark进行图形流量分析
用法:
ibdump [选项]
选项:
-d,--ib-dev = <dev>使用IB设备<dev>(找到默认的第一个设备)
-i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
-w,-write = <文件> 结果保存到文件(默认为“ sniffer.pcap”)
“-”代表标准输出-启用管道传输到tcpdump或tshark。
-o,--output = <文件>是-w选项的别名。不使用-为了向后兼容
-b,--max-burst = <log2突发> log2的最大突发大小
捕获而没有数据包丢失。
每个条目占用〜MTU字节的内存(默认12-4096个条目)
-s,-silent不打印进度指示。
-T,--conti使用连续页面。
-M,--mem-mode <大小>(指定时),仅在抓包动作停止后才将包写入文件,它比默认模式快(丢包更少)
,但占用更多内存。在这种模式下,ibdump在捕获<size>个字节后停止
-p,--writer-thread <大小>使用特定线程将数据写入磁盘。为了使用此功能,您必须指定
两个临时缓冲区的大小,用于保存数据给线程写入磁盘
--decap 解封装端口镜像的headers。用于捕获RSPAN流量时需要启用。
-h,--help显示此帮助屏幕。
-v,--version打印版本信息。
用法: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
- 用法
启用步骤:
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页。有关更多信息,请参阅工具的手册页。
Mellanox 社区--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抓包:
ibdump -d mlx5_1 -i 1
ibdump -d mlx5_1 -i 1 -w msg.acp #抓包并写入msg.acp
-d,--ib-dev = <dev>使用IB设备<dev>(找到默认的第一个设备)
-i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
-w,-write = <文件> 结果保存到文件(默认为“ sniffer.pcap”)
“-”代表标准输出-启用管道传输到tcpdump或tshark。
(更多参数说明见本文后面)
测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954
2.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-rdma2、启动容器
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文件中。
-s:截取报文的内容,默认截取96字节,-s0表示截取全部
-i:指定监听的网口
(更多参数说明见本文后面)
3.tcpdump (tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer
在ConnectX®-4和更高版本的网卡中受支持。
Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获
使能Offloaded Traffic Sniffer:
-
Turn on the new ethtool private flags "sniffer" (off by default).
$ ethtool --set-priv-flags enp130s0f0 sniffer on
-
在要监听的以太网接口上设置
sniffer
标志后,运行tcpdump捕获该接口上的bypass kernel 流量。
注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。
有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:
一、前提条件
设置
注意:如果您使用的是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测试完成后,在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.181502 ---------------------------------------------------------------------------------------
5.检查输出文件。
在此示例中,UDP端口4791用于RoCEv2通信。# 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..
如果您将文件保存给Wireshark,则会收到以下消息:
“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”
Intel RDMA网卡
intel主机侧的抓包工具仍然在开发中,目前(2022-10)只能通过在交换机上or交换机镜像到主机上来抓包。或者 通过和mellanox网卡通信,在mellanox主机上抓包
端口镜像方式
使用tcpdump捕获RDMA流量
-----------------------------------
RDMA通信绕过内核,Linux的tcpdump 通常不可用。您可以通过在交换机上使用端口镜像来使用tcpdump捕获RDMA通信。
1.将3个主机连接到交换机:
- 2个做RDMA通信主机。
- 1个做监控流量主机。
2.配置交换机将一个通信主机连接的交换机端口镜像到监控主机连接的交换机端口。
怎么配置镜像请参阅交换机文档。
(Configure the switch to mirror traffic from one compute node's switch port
to the monitoring host's switch port. Consult your switch documentation
for syntax.)
3.在监控主机上卸载IRDMA驱动程序:
# rmmod irdma
irdma驱动处于加载状态,则可能无法正确捕获流量。
4.在监控主机上启动tcpdump 。例如:
# tcpdump -nXX -i
5.在2通信主机之间进行RDMA通信。 RDMA数据包将出现在
监控主机上的tcpdump上。
原文链接:https://blog.csdn.net/bandaoyu/article/details/116203690
在mellanox主机上抓包
intel RDMA网卡的主机和 mellanox网卡的主机通信,在mellanox网卡的主机上抓包
抓包过滤
tcpdump 过滤TOS值和DSCP值的抓包分享:
首先在一台Linux机器上持续ping,-Q 40 标识ICMP包的DSCP字段为40,对应AF11
然后我们另开一个shell 用tcpdump抓包:sudo tcpdump -v -i eth0 ‘ip[1]&0xfc == 40’,ip[1] 是过滤IP包头的第2个字节,0xfc相当于掩码忽略掉后两位ECN位。
这样就可以抓到AF11的包,对应上表DSCP值10[0x0a],TOS值40[0x28]。
原文链接:https://blog.csdn.net/qq_33681684/article/details/123747965
抓包测试
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模式
在一个服务器上运行
# 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
--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=1000000、1000001、1000010、1000011,即64
实战
- 使能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
- 运行监听工具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
- 运行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=1000000、1000001、1000010、1000011,即64、65、66、67
日期 | 变更人 | 版本 | 备注 |
数据收发测试工具:
RDMA通信测试工具|RDMA信息查询工具_https://blog.csdn.net/bandaoyu/article/details/115798045
三、抓包结果文件拆分
抓的包太大,怎么拆分成多个文件呢?
边抓包边切割
常用的命令选项有:
-c:设定抓取的数量
-i:指定监听的网口
-w:将抓取的数据包保存到文件
-s:截取报文的内容,默认截取96字节,-s0表示截取全部
-r:读取数据包内容
-C 10: 每10M保存一个包
-G 600:每10分钟保存一个包
切割已经爪完成的包
用tcpdump就可以直接拆分抓到的数据包。
tcpdump -r ***.pcap -w newfile -C 1000
就是从已经捕获的文件读取,然后再另存成新文件,并且每个文件大小是1000M(不过不是1G,是1000M个字节)
四、抓包结果分析
RoCEv2 帧结构|RoCE和RRoCE|Soft-RoCE_https://blog.csdn.net/bandaoyu/article/details/117560876
五、RoCEv2的传输和抓包原理
- 当RDMA数据包通过以太网到达并被RDMA网卡接收时,理论上,与RDMA传输相关的数据包处理(包括IP和UDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,而不需要操作系统内核的介入。
- 在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)号、序列号等。
RDMA网卡数据包处理(包括IP和UDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,当解析到载荷数据不是RDMA数据时,是不是就把数据包传递给内核的IP/TCP协议栈处理?
是的,
RDMA数据传输:当网卡检测到传入的数据包是RDMA协议的一部分(例如,使用特定的UDP端口和协议标识符),它会按照RDMA的方式处理这些数据,利用硬件加速路径直接在网卡和应用程序之间传输数据,绕过传统的内核网络栈。这样可以提供极低的延迟和高带宽,适用于高性能计算和存储网络。
非RDMA数据传输:当网卡检测到传入的数据包不属于RDMA操作(即,数据载荷不是RDMA数据时),如常规的IP数据包,这些包会被传递给操作系统的网络协议栈进行处理。
RoCE数据包处理(包括IP和UDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,而不需要操作系统内核的介入。是不是意味着,RDMA网卡的固件也需要实现IP/TCP协议栈?
确实,对于RDMA over Converged Ethernet(RoCEv2)这类情况,RDMA网卡的固件需要能够处理一定层面上的IP和UDP协议功能,尽管这不是一个完整的传统意义上的TCP/IP协议栈。
总的来说,RDMA网卡并不需要具备一个完整的TCP/IP协议栈,但它确实需要实现那些直接相关于其数据包协议(在RoCEv2的情况下是IP和UDP)的基础处理能力。
RoCE数据包处理(包括IP和UDP头部的处理)是直接在RDMA网卡(硬件)层面上完成的,而不需要操作系统内核的介入,那运行在linux上的tcpdump是如何抓取到RoCEv2数据包的?
首先,tcpdump是一个强大的网络数据包分析工具,它基于网卡抓取流动在网卡上的数据包。在Linux系统中,tcpdump通过直接访问网络接口(如RDMA网卡)来捕获数据包。这意味着,尽管RDMA网卡内部进行了复杂的数据处理,但数据包在通过网络接口发送或接收时,tcpdump仍然能够捕获到它们。
其次,当RDMA网卡通过DMA(直接内存访问)技术将数据直接传输到应用程序的内存时,这些数据包在传输过程中仍然会经过网络接口。这意味着,尽管DMA操作绕过了CPU和操作系统内核,但数据包本身仍然会在网络接口层面可见。
说白了,就是tcpdump 直接读取网卡的缓存堆栈等抓取数据.
在Linux系统上,tcpdump 能够捕获到RoCEv2数据包的主要原因是这些数据包仍然遵循标准的以太网、IP和UDP协议封装。尽管RDMA数据包的处理和传输是在RDMA网卡的内部专用处理器或硬件逻辑上执行的,但在网络层面上,这些数据包仍然是标准的网络帧和报文。
这是怎么做到的:
- 网络接口的监听:tcpdump 工作在网络接口层级,利用Linux操作系统提供的包捕获接口(如libpcap库)来监听网络接口上的数据流。当数据包通过网络接口时,无论其内容是什么,tcpdump 都能捕捉到这些以太网帧。
- 标准协议封装:RoCEv2数据包使用标准的以太网帧封装,内含IP和UDP头部,因此这些数据包在物理层和链路层看起来与其他类型的网络流量(如HTTP或FTP)没什么不同。tcpdump 通过分析这些头部信息,可以辨认出特定的RoCEv2流量。
- RoCEv2识别:tcpdump 可以根据IP和UDP的头信息,如目的端口号,来识别出RoCEv2数据流。RoCEv2通信通常使用特定的端口号,tcpdump 可以配置过滤规则来只捕获特定端口的通信,从而实现对RoCEv2数据包的捕获。
- 网络堆栈的透明度:尽管RDMA操作旨在绕过操作系统的网络堆栈以减少延迟和提高效率,但这种操作的精确方式(尤其在数据包接收和发送时)并不妨碍使用网络监控工具(如tcpdump)在网络层(特别是在数据包进出网络接口的时刻)进行监控。因为这些工具操作在较低层次的网络接口级别,使得它们能够捕获到通过网络接口的所有数据包,包括RoCEv2数据包。
因此,即使RDMA数据传输的细节是在网卡的硬件中处理的,tcpdump 这类工具仍然能够通过捕获和分析网络接口上的数据流来监视这些传输。这为网络管理员和系统管理员提供了一种强大的工具,以监控和调试RDMA和其他类型的网络流量。
在网络接口层级上监听数据流来捕获数据包。 怎么理解这句话?
这句话指的是在计算机网络通信中,有一层专门负责处理数据包的传输和接收,即网络接口层。在这个层级上,网络接口会接收来自网络的数据流,并将其传递给操作系统的网络协议栈进行处理。同时,它也会将操作系统要发送的数据包传输到网络中。
当我们说在网络接口层级上监听数据流时,意味着某个软件或工具(比如 tcpdump)会在这个网络接口层级上监视网络通信的数据流。它可以实时地获取从网络中接收到的数据包,并且也能够捕获操作系统要发送的数据包。
因此,通过在网络接口层级上监听数据流,tcpdump 就能够捕获通过这个网络接口传输的数据包,从而实现了对网络通信的监控和分析。
RDMA 用什么抓包工具分析帧? - 知乎 (zhihu.com)
=========================草稿======================
RDMA抓包
-
- 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/102925954
ibdump github: https://github.com/Mellanox/ibdump
注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包
-
- 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文件中。
-
- tcpdump (Offloaded Traffic Sniffer,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer
在ConnectX®-4和更高版本的网卡中受支持。
Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获
- 使能Offloaded Traffic Sniffer:
Turn on the new ethtool private flags "sniffer" (off by default).
$ ethtool --set-priv-flags enp130s0f0 sniffer on
(在运行tcpdump的主机上)
- 在要监听的以太网接口上设置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的值
-
- 验证RDMA抓包效果(Run RDMA traffic):
- ib_send_bw/ib_write_bw
- 验证RDMA抓包效果(Run RDMA traffic):
测试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
-
-
- bv_xxx_pingpong
-
使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:
RDMA抓包
嗅探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/102925954 ibdump github: https://github.com/Mellanox/ibdump
最新消息: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文件中。
原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer 在ConnectX®-4和更高版本的网卡中受支持。 Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获
Turn on the new ethtool private flags "sniffer" (off by default). $ ethtool --set-priv-flags enp130s0f0 sniffer on (在运行tcpdump的主机上)
注意:使能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 (抓取网卡ib3b-0上 172.17.31.54 与 172.17.31.54 之间的udp数据包,只有SEND的时候走IP,能识别为UDP包,当使用WRITE/READ时,不走IP,走的是GID,所以tcpdump不能使用ip和udp过滤,否则就把RDMA包给过滤了) 测试完成后,在wireshark中打开文件。 请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。 Tcpdump 抓到的包的tos更像是dscp的值
测试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
使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:
服务器端运行: rdma_server #默认端口是7471 客户端运行: rdma_client -s 服务端IP 帮助:man rdma_server
用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=1000000、1000001、1000010、1000011,即64、65、66、67
交换机需要安装Packet Capture :https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
过程:
# 在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. 输入Device的IP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014。 d. 点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。 更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
在53机器上: ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
[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
我们要监听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过滤)
查询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=1000000、1000001、1000010、1000011,即64、65、66、67 |
-
-
- rdma_server
-
服务器端运行:
rdma_server #默认端口是7471
客户端运行:
rdma_client -s 服务端IP
帮助:man rdma_server
-
-
- 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=1000000、1000001、1000010、1000011,即64、65、66、67
-
- 远程捕获交换机数据包
交换机需要安装Packet Capture
:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
图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. 输入Device的IP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014。
d. 点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。
更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
-
- 抓包记录
- tcpdump -Offloaded Traffic Sniffer
- 抓包记录
在53机器上:
ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
- 使能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
- 运行监听工具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
- 运行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=1000000、1000001、1000010、1000011,即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)