我有运行 IP 多播测试的脚本;但是,我的脚本在特定的 Linux 机器上失败了。
我知道我可以查看CONFIG_IP_MULTICAST
内核配置文件来确定内核是否是用它编译的。但是,如果我可以查看/proc
或sysctl
并获得答案,那么在我的脚本中标记缺少的需求会更容易。
有没有一种方法可以在不查看的情况下找到 IP 多播是否已编译到内核中CONFIG_IP_MULTICAST
?
答案1
在你的linux机器上:
ip maddr show
给出:
@4Gtest ~]$ ip maddr show
1: lo
inet 224.0.0.1
inet6 ff02::1
2: p3p1
link 01:00:5e:00:00:01
link 33:33:00:00:00:01
link 33:33:ff:bd:7e:0f
link 01:00:5e:00:00:fb
link 01:00:5e:7f:ff:05
inet 224.127.255.5
inet 224.0.0.251
inet 224.0.0.1
inet6 ff02::1:ffbd:7e0f
inet6 ff02::1
答案2
似乎大多数内核(v1 之后)默认支持多播,或者在编译时启用了 CONFIG_IP_MULTICAST。要检查编译和运行的内核是否订阅了任何多播组,我将使用netstat -g
.
看来大多数内核(v1 之后)默认支持多播。
[root@centos module]# grep CONFIG_IP_MULTICAST /usr/src/kernels/2.6.18-274.7.1.el5-i686/.config
CONFIG_IP_MULTICAST=y
[root@centos module]# netstat -g
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 all-systems.mcast.net
eth0 1 224.0.0.251
eth0 1 all-systems.mcast.net
我看到我的主机上的 eth0 接口认为它订阅了 224.0.0.251 basic mcast group 。另外,如果我 ping 组或网络,然后所有已知的启用多播的主机网络都返回给我,我会说多播正在该主机上工作。您可以尝试netstat -g
或cat /proc/net/igmp
查看它是否返回您主机上的任何组吗?
答案3
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:F1:FF:EA
inet addr:78.46.74.27 Bcast:78.46.74.31 Mask:255.255.255.224
inet6 addr: fe80::20c:29ff:fef1:ffea/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5339836 errors:0 dropped:0 overruns:0 frame:0
TX packets:5486444 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:820300389 (782.2 MiB) TX bytes:1929979381 (1.7 GiB)
Base address:0x1400 Memory:e8820000-e8840000
禁用多播:
ifconfig eth0 -multicast
结果:
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:F1:FF:EA
inet addr:78.46.74.27 Bcast:78.46.74.31 Mask:255.255.255.224
inet6 addr: fe80::20c:29ff:fef1:ffea/64 Scope:Link
UP BROADCAST MTU:1500 Metric:1
RX packets:5339836 errors:0 dropped:0 overruns:0 frame:0
TX packets:5486444 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:820300389 (782.2 MiB) TX bytes:1929979381 (1.7 GiB)
Base address:0x1400 Memory:e8820000-e8840000
界面中不存在多播
启用组播:
ifconfig eth0 multicast
答案4
请注意,如果您想使用 ping 测试您的设置,则必须禁用忽略多播 ping 的选项:
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=0