【问题标题】:How to discover multicast addresses range in Java?如何在 Java 中发现多播地址范围?
【发布时间】:2018-08-28 10:13:48
【问题描述】:

也许这个问题很奇怪。我不知道。 例如,在 Java 中获取多播数据包:

byte[] buf = new byte[1500];
MulticastSocket socket = new MulticastSocket(1234);
InetAddress group = InetAddress.getByName("233.0.0.1");
socket.joinGroup(group);

while (true) {
   DatagramPacket packet = new DatagramPacket(buf, buf.length);
   socket.receive(packet);
   // doing something with packet
}
socket.leaveGroup(group);
socket.close();

但如果我知道多播组地址,它会很好地工作。如果我不知道怎么办? 我需要扫描网络并按端口查找所有可用的多播流。我不知道地址,但我知道端口。有可能吗?

假设我有 3 个地址为 233.0.0.1:1234、233.0.0.2:1234、233.0.0.3:1234 的流。我需要通过端口 1234 发现网络并找到此地址。如果不遍历循环中的所有多播地址并加入每个组,我该如何做到这一点?

【问题讨论】:

    标签: java networking multicast discovery


    【解决方案1】:

    如何在 Java 中发现多播地址?

    AFAIK,Java(目前)没有办法做到这一点。

    问题在于多播路由本质上是接收器驱动的。它是这样的:

    • 当应用程序启动多播组时,它使用其中一种 PIM 协议来确定如何路由其出站数据包。这会导致创建分发树。
    • 当应用程序加入多播组时,本地主机向网络发送 IGMP 请求。这流经本地路由域中的交换机。
    • 如果其中一台交换机识别出该组,则将本地主机添加到该组的分发树中。
    • 如果 IGMP 在未识别的情况下向 Internet 请求网关(并且多播 IP 不是私有的),则网关将使用 MBGP 尝试查找组。
    • 如果 BGMP 请求找到组,则网关加入分发树。

    如您所见,这无需任何集中权限即可工作。实际上,如果您的本地路由域中当前没有任何东西在使用给定的多播组,那么网络上可能没有它的踪迹。可以窥探 IGMP 流量……但这只会告诉您本地正在使用的组,而不是所有可用组。

    如需了解更多信息,请参阅IP Multicast 上的 Wikipedia 文章。


    通常,大多数多播路由和关联协议都在您的网络交换机中实现。但是,有基于 linux 的软件支持多播路由等;见http://troglobit.com/howto/multicast/。您可以使用它来进行 IGMP 侦听……尽管这有局限性;见上文。


    您的代码似乎根本没有进行多播地址发现。相反,它正在加入特定组,并在 IP 地址上接收多播流量。

    AFAIK,您无法从标准 Java 监控“所有多播流量”。 Java 不支持混杂模式。但是,可以使用 jpcap 库来实现...但需要注意的是,您只会看到到达本地网段的流量。

    【讨论】:

    • 感谢您的回答。现在对我来说很清楚了。我只是想获得类似命令tcpdump -i eth1 port 1234 的输出的IP 列表。它捕获此端口的所有数据包。但如果在 Java 中是不可能的,我接受它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2011-01-17
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多