Linux 当然是(你怀疑过吗?),完全符合 Level-2 组播标准。它满足发送、接收组播数据报以及充当组播路由器 (mrouter) 的所有要求。
如果你只想发送和接收,在配置内核时,你必须选择“IP: multicasting”。如果你还想让你的 Linux 主机充当组播路由器 (mrouter),你还需要在内核中启用组播路由,方法是选择“IP: forwarding/gatewaying”、“IP: multicast routing”和“IP: tunneling”。选择“IP: tunneling”是因为新版本的 mrouted
依赖 IP 隧道技术来发送封装在单播数据报中的组播数据报。这在组播主机之间建立隧道时是必要的,这些组播主机被仅支持单播的网络和路由器分隔开。(mrouted
是一个守护进程,它实现了组播路由算法 - 路由策略 - 并指示内核如何路由组播数据报)。
一些内核版本将组播路由标记为“EXPERIMENTAL”,因此你应在“Code maturity level options”部分启用“Prompt for development and/or incomplete code/drivers”。
如果在运行 mrouted
时,在你 Linux 主机连接的同一网络中生成的流量被正确转发到另一个网络,但你无法在本地网络上看到另一个网络的流量,请检查你是否收到 ICMP 协议错误消息。几乎可以肯定你忘记在 Linux 路由器中启用 IP 隧道。当你明白时,这是一种愚蠢的错误,但相信我,当你不知道时,这非常耗时,而且没有明显的理由解释哪里出了问题。在这种情况下,抓包工具 (sniffer) 非常有用!
(你可以在 路由策略和转发技术 部分了解更多关于组播路由的信息;mrouted
和隧道技术也在 MBone 和 组播应用 部分中进行了解释)。
一旦你编译并安装了新的内核,你应该为组播流量提供一个默认路由。目标是添加一条到网络 224.0.0.0 的路由。
大多数人在此配置阶段似乎面临的问题是需要提供的掩码值。如果你已经阅读了 Terry Dawson 撰写的优秀 NET-3-HOWTO,那么猜出正确的值应该不难。正如那里解释的,网络掩码是一个 32 位数字,IP 地址的网络部分填充为全 1,主机部分填充为全 0。回想一下第 2.1 节,D 类组播地址没有网络/主机部分。相反,它有一个 28 位的组标识符和一个 4 位的 D 类标识符。好吧,这 4 位是网络部分,剩下的 28 位是主机部分。因此,所需的网络掩码是 11110000000000000000000000000000,或者更易于阅读的形式:240.0.0.0。那么,完整的命令应该是
route add 224.0.0.0 netmask 240.0.0.0 dev eth0
根据你的 route
程序有多旧,你可能需要在 add
之后添加 -net
标志。
这里我们假设 eth0
具有组播能力,并且在没有另行指定的情况下,我们希望组播流量从那里输出。如果你的情况并非如此,请根据需要更改 dev
参数。
/proc
文件系统再次证明在这里很有用:你可以查看 /proc/net/igmp
以查看你的主机当前订阅的组。