正如 dirkt 所指出的,我缺少信息:这是这问题,但总而言之,我正在尝试接收大量多播流量,多个接口可以处理,因此为了接收所有流量,我想使用多个接口并分别加入每个接口上的流。
我有三个 NIC,其中 1 个(我们称之为 webIf)连接到互联网,另外 2 个(我们称之为 lanIf1 和 lanIf2)连接到 LAN(两者相同)。我试图在它们两个上接收多播流量,但只有一个接口在接收 IGMP 查询时报告,并且仅针对它加入的流。因此,在超时时间过后,交换机将停止发送另一个接口加入的流。
为了解决这个问题,我尝试使用策略路由:为每个 lanIf 创建一个路由表,在每个 lanIf 上添加一条路由以转到同一网关,并在使用主路由之前创建两条规则以使用两个新的路由表桌子
所以如果我的地址是:
lanIf1: 25.25.43.88
lanIf2: 25.25.43.84
default gateway of the lan switch: 25.25.43.5
igmp querier: 25.25.43.1
我首先将表添加到 /etc/iproute2/rt_tables ,如下
cat /etc/iproute2/rt_tables
所示:
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
2 lanIf1Table
3 lanIf2Table
然后我以 root 身份运行这个脚本:
ip route add 25.25.43.0/24 dev lanIf1 src 25.25.43.88 table lanIf1Table
ip route add default via 25.25.43.5 dev lanIf1 table lanIf1Table
ip route add 25.25.43.0/24 dev lanIf2 src 25.25.43.84 table lanIf2Table
ip route add default via 25.25.43.5 dev lanIf2 table lanIf2Table
ip rule add from 25.25.43.88 table lanIf1Table prio 1000
ip rule add from 25.25.43.84 table lanIf2Table prio 1001
但随后什么也没有发生,IGMP 查询仅由其中一个接口应答。
我能让任何事情发挥作用的唯一方法是更改规则之一:
ip rule add from 0.0.0.0 table lanIf1Table prio 1000
。然后,IGMP 报告在 lanIf1 上完成。但随后我就失去了所有互联网访问权限,当然,因为所有流量都会通过lanIf1Table
。
我究竟做错了什么?我一直在关注这些教程: http://www.rjsystems.nl/en/2100-adv-routing.php
https://blog.scottlowe.org/2013/05/29/a-quick-introduction-to-linux-policy-routing/
答案1
以下是开关的工作原理:
该交换机有多个网络端口,这些端口点对点连接到计算机上的 NIC。如果 NIC 可以达到 25 GB/s,则意味着点对点连接将使用达到 25 GB/s 的协议。
现在有了一个哑开关,这也意味着传入路由到该 NIC 的连接限制为 25 GB/s。此外,哑交换机会将多播路由到所有端口。因此,如果同一台计算机中有两个 25 GB/s NIC,您将在每个 NIC 上获得相同的多播数据包,总速度为 25 GB/s。不管交换机本身能力强还是带宽更高。
但在该带宽段,交换机可能非常智能,具有内部存储器。所以交换机可以做多种事情:
1) 它将在内部 RAM 中存储和转发数据包。这意味着传入连接不会限制为传出连接的最大速度。
2) 如果可以进行绑定,则可以将两个点对点连接捆绑为一个具有双倍带宽的连接。
3) 如果它是多播感知的,并且监听多播协议,则它只会将数据包转发给多播组的注册接收者。因此,如果您有两个不同的多播组(或更多),并且一个 NIC 上的应用程序在一个组上注册,而另一个 NIC 上的应用程序在另一个组上注册,则实际上会使带宽加倍。再次强调:这些需要是不同的多播组,仅仅不同的应用程序是不够的。
因此,最简单的方法是 (2):绑定 NIC 并完成操作。
对于(3),我们还没有解决Linux 不能很好地处理不同NIC 上的相同子网的问题。有一些方法可以解决这个问题:
a) 将网络接口放在不同的网络命名空间中,并在命名空间中启动接收应用程序。
b) 有申请绑定到网络接口。并非所有应用程序都能够做到这一点,而且我实际上不确定多播是否没有复杂性(它适用于单播)。
c) 使用不同的子网,并在网络架构中的其他位置(例如在交换机上,如果可以的话)在子网之间路由多播。
所有这些都比(2)困难得多。
所有这些只会让您获得 2 倍的增益。无损视频压缩(如果您坚持保留视频中的噪声像素)也会为您带来 2-3 倍的增益,而稍微有损压缩则会为您带来更好的因子。而且它并不需要大量的 CPU 就可以实现不错的效果。因此,在您所处的带宽范围内,我肯定会考虑将压缩作为第一步,然后再扰乱网络。
答案2
这里解释一下: https://access.redhat.com/solutions/53031
这里不太清楚: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
考虑一台具有 2 个网络接口(接口 A 和接口 B)的计算机。考虑到 Linux 决定使用接口 B 向 IP 地址 X 发送数据包。考虑到接口 A 上从 IP 地址 X 接收到的数据包。Linux 将丢弃该数据包。
除非您
sysctl net.ipv4.conf.all.rp_filter=2
在终端中运行或将该行添加到/etc/sysctl.conf
.
它可以从其他接口上的某个 IP 地址接收数据包,而不是用于将数据包发送到该 IP 地址的接口!