1

我有一台带有两个网络接口卡的机器。我想知道是否要向其中一个 LAN 发送多播消息 - 是否必须在该 LAN 中使用机器的 ip,或者可以从 LAN 输入 ant ip?

也就是说,假设机器的 IP 是:190.20.20.20,而该 LAN 中的另一台机器是:190.20.20.1

  1. 我可以输入:multcastiScoket.setInterface("190.20.20.1");

  2. 如果是这样 - 那台机器是否必须打开?

谢谢你。

4

3 回答 3

3

虽然多播有其自己的路由特性,但重要的是要了解明确选择 NIC(对于发送方和接收方)很重要并且确实会产生影响(除非您想依赖特定操作系统的“自动”实现,这在生产中会变得非常棘手)。

首先,让我们澄清一下,它java.net.MulticastSocket可以并且用于:发送和接收消息(这并不意味着发送 MC 和接收 MC 是相似的;接收者必须执行IGMP连接等,在等上可见ip maddr等)。

通常,在创建这些套接字时指定的越多越好(否则您将受制于操作系统,并且必然会发生不太容易调试的情况)。

对于接收器套接字,您应该:

  • 指定端口(在构造函数中);防火墙应该udp对该端口上的入站流量打开,
  • 指定接口(通过socket.setNetworkInterface);否则操作系统将采用可用接口之一(通过检查ip maddr),
  • 指定 MC 组(例如 via socket.joinGroup(InetAddress.getByName("230.0.0.0"))(这会触发 IGMP 机制,通过 可见tcpdump -i your_interface -n ether multicast

对于 Sender 套接字,您应该类似地,

  • 指定 MC 组(相同的命令),
  • 指定接口(相同的命令)

如果赞成上述观点,我会提出两个论点,

  1. 在 CentOS 7 上使用两个 NIC(enp0s3enp0s8)测试了简单的发送器和接收器(此处为代码)。只有通过在接收器上设置 NIC 显式性,我才能自信地判断 IGMP 加入将在哪个 NIC 上发出,以及程序将在哪个 NIC 上列出(通过ip maddr)加入 MC 组;通过将 Sender 设置到特定的 NIC 上,很容易验证,发送enp0s3只会到达接收者enp0s3,而不是enp0s8(类似地,tcpdump将数据包显示为所选接口上的出站)。当然,在没有开始在 OS 上使用 MC 路由的情况下就是这样,它可以根据需要路由数据包,
  2. 您可能会想象像您这样的设置,其中两个不同的 NIC 将导致完全分离的 LAN,这可能进一步具有 MC 路由的所有/完整元素(指定的路由器,可能是集合点等)。因此,为 IGMP 连接选择合适的 NIC 至关重要,它决定了一切;如果这些发给了错误的网卡,您可能无法接收到 MC 流量;如果将它们发给两个 NIC,您可能会得到比您想要的更多的东西。

我希望这会有所帮助(即使问题到现在已经 6 岁了);

于 2018-07-27T16:31:08.993 回答
2

IIRCMulticastSocket用于接收多播消息,您需要对其进行配置setGroup以侦听绑定到特定多播 IP 地址的多播消息。如果您想发送多播消息,事情要简单得多:您只需将消息发送到特定的多播 IP 地址,路由器/网关将为您处理实际的多播逻辑。(因此,您确实需要一个能够正确支持多播的路由器/网关。)

编辑:Java 教程也涵盖了这个主题:http ://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html

于 2012-06-24T01:36:37.633 回答
1

setInterface() 方法中的 IP 地址是您自己的接口之一的地址。这用于您有多个 NIC,全部连接到不同子网的情况,并且您希望多播加入和离开组消息发送到不是 IP 路由表的默认路由的子网。

在您提到的情况下,根本不需要调用 setInterface() 。

如果您希望机器接收消息,则必须打开它。

于 2012-06-24T01:30:13.493 回答