多网卡主机下,使用iPerf3打流时,如何控制通过哪个网卡进行打流,这是一个常见的问题。
阅读iperf3的官方说明文档,我们能看到下面说明
-B, --bind host | Bind to host, one of this machine's addresses. For the client this sets the outbound interface. For a server this sets the incoming interface. This is only useful on multihomed hosts, which have multiple network interfaces. 翻译:绑定到主机,主机的一个地址。对客户端来说,这个设置数据发送从哪个接口发送。 对服务端来说,这是设置数据从哪个接口接收。这个命令只在多宿主主机(二个或者二个以上网络接口)中有用。 |
(最新的iperf3 3.13版本里,这个参数有更新,对老版本iperf3兼容,所以并不改变本文内容的有效性,具体参见:iperf3指定网卡测试-B参数更新 或 --bind-dev参数详解)
看起来是非常清楚的描述,但其实在接口(interface)这里语焉不详,这个接口是指网络网卡呢,
还是指IP接口?-B选项和主机路由之间的关系如何?
-B选项对客户端来说意味着:
如果你的客户端主机虽然有多个网络,但多个网络属于不同的子网,并且只有一个网络端口可
以到达你的目标服务端主机,那么你不会有以下问题。
如果你的客户端主机有多个网络,并且有多个网络端口都可以到达你的目标服务端主机,而你希
望指定iPerf3从特定网络端口发送数据到目标服务端主机,那么本文会帮助你更快的达到目标。
问题:
从哪个接口(interface)发送是和-B后跟的IP地址有关,还是跟主机路由表里设定的表项有关?
如果路由表设设置和-B绑定的IP地址冲突了如何处理?
答案与结论(不想看详细的,看下面结论就可以了):
1)如果你用了-B参数,iPerf3会越过主机ip地址和物理网卡的绑定关系。
2)iPerf3会用-B参数指定的IP地址发送数据。
3)iPerf3会把数据从主机路由表指定的物理网卡发送出去。
(注意:windows端的iperf3 这个结论好像不成立,windows端的行为:看起来是-B指定哪个IP就从哪个IP对应的网卡出去,还没有仔细研究过,
要找下带二个网卡的WINDOWS机器试一下)
我们看一下如下测试:
测试环境配置:
测试主机环境为二台Linux主机,一台是树莓派主机,安装了raspberry pi OS,有二个网络接口eth0和wlan0,
分别是192.168.3.15和192.168.3.243二个IP地址,掩码为255.255.255.0,通过二层交换机和普通PC主机
相连,PC主机安装的是ubuntu,只有一个网卡,IP地址为192.168.3.231,掩码是255.255.255.0。
三个网卡属于同一个局域网,默认网关地址都是192.168.3.1。iPerf3客户端工作在树莓派上,iPerf3服务端工作在普通PC主机上。
无-B选项测试:
树莓派中的默认主机路由表如下:
由于我们的目标地址是普通主机(192.168.3.231),由上述主机路由可见:
如果没有-B指定的情况下,如下图所示,我们可以看到iPerf3客户端选择192.168.3.15端通过eth0将
数据发送到192.168.3.231服务端(通过ifconfig命令,我们可以看到eth0发送的数据包数量增加了约
100M Bytes)。这是符合预期的,因为第3条网络路由表项的Metric是202,优先级大于第4条网络
路由表项的Metric 303。
有-B选项配置:
下面我们用:
sudo route add -host 192.168.3.231 metric 100 dev eth0
命令为树莓派主机增加一条主机路由,指定发往192.168.3.231(普通PC,iPerf3服务端)的数据包,
从eth0发送(主机路由优先级>网络路由>默认路由,,并把Metric设为100做为双保险)。
第一步:
通过ifconfig和route查看到前网络状态(eth0已经发送了1.1G bytes数据)
第二步,
用iperf3 -c 192.168.3.231 -B 192.168.3.243命令指定从192.168.3.243接口发送数据
我们从iperf3服务端可以看到,服务端收到从192.168.3.243发送过来的数据。
那么这个数据是从哪个网卡发出来的呢?eth0还是wlan0? 我们看下一步。
第三步,
通过ifconfig查看到前网络状态(eth0已经发送了1.2G bytes数据)
我们会看到eth0口发送的数据量从原先的1.1G增加到了1.2G,而wlan口发送的数据保持在46.3M bytes几乎没有变化
这说明:iperf3 -c 192.168.3.231 -B 192.168.3.243,用WLAN0口的IP:192.168.3.243,通过eth0,发送数据到服务端。
则:ip地址用了-B指定的,真实的发送数据的网卡则用了主机路由表项指定的网卡。
有-B选项的进一步测试:
下面,我们做进一步的测试来说明我们上述的结论:
第一步:
修改主机路由表:
sudo route del -host 192.168.3.231 metric 100 dev eth0
sudo route add -host 192.168.3.231 metric 100 dev wlan0
修改成功后,指定发往192.168.3.231(普通PC,iPerf3服务端)的数据包,从wlan0发送
(主机路由优先级>网络路由>默认路由,,并把Metric设为100做为双保险)
通过ifconfig命令,我们可以看到当前网络状态如下:
第二步:
用iperf3 -c 192.168.3.231 -B 192.168.3.15指定通过 192.168.3.15发送数据
服务端从192.168.3.15收到了数据包。
第三步,
通过ifconfig命令,检查发送后的网络状态
eth0的发送数据包几乎没有变化,保持在1.3G bytes, 而wlan0的发送数据包则从46.3M增加到了49.5M bytes
这说明:iperf3 -c 192.168.3.231 -B 192.168.3.15,用eth0口的IP:192.168.3.15,通过wlan0,发送数据到服务端。
再一次说明则:ip地址用了-B指定的,真实的发送数据的网卡则用了主机路由表项指定的网卡。
结论:
1)如果你用了-B参数,iPerf3会越过主机ip地址和物理网卡的绑定关系。
2)iPerf3会用-B参数指定的IP地址发送数据。
3)iPerf3会把数据从主机路由表指定的物理网卡发送出去。
目录