【问题标题】:How to limit the scope of multicast explicitly to 1 hop only?如何将多播的范围明确限制为 1 跳?
【发布时间】:2015-11-11 09:51:21
【问题描述】:

这是我的第一个问题,如果我问错了,我深表歉意。

在我的实验中,使用 WiFi Direct 连接了多个 android 设备。为了利用无线 tx 的广播特性,所有设备都加入一个多播组以交换它们的信息。我的意图是让发送者只发送其信息的一份副本,而所有 1-hop 邻居都接收它。

我的麻烦是,更远的节点也在接收它。

考虑这个例子:

A----B----C

同时:

A----D

1) 通过 wifi direct 连接; 2) 他们加入一个多播组进行消息交换。

我想要的是:如果 A 发送,B 和 D 可以接收,而不是 C;如果B发送,A和C可以接收,D不行。基本上就是所谓的“一跳广播”。

我得到了什么:如果 A 发送,B 和 D 接收,B 帮助中继它(我猜是由于 udp 多播建立的 mac 层多播?)所以 C 也接收它。

我查了一下,multicastSocket有一个setTimeToLive()方法,参数为:

0:不在网络上发送,只在本地使用;

1:仅本地网络,不经过路由器;

...

但是我不知何故需要介于 0 和 1 之间的东西,所以我可以将 tx 限制为仅 1 跳。我找不到解决办法。

您可能会问我为什么需要限制范围。这是为了防止泛洪,从而减少网络资源消耗。

您可能会问为什么不对每个邻居使用单播。这在邻居集基数方面存在可扩展性问题,应该通过多播/广播有效地解决。除非 wifi direct 实际上在 mac 层使用单播“模拟”多播/广播?

您可能还会问我为什么不为每个节点创建一个不同的 multicastSocket 让他的邻居加入。我考虑过这一点,但不确定管理所有这些套接字的复杂性。

抱歉写了这么久。我期待着任何建议。

编辑:

--- 我们尝试设置TimeToLive(1),但是距离发送者2跳的节点仍然可以接收到消息。

--- 我们检查了默认的 TTL,并确认默认值已经是 1。

--- 我的感觉是 TTL 不会随着它从一跳到另一跳而减少,它只是限制了“本地网络”内的传输,即不通过路由器。通过 WiFi Direct 连接的无线节点,网络可以被视为单个“本地网络”,因此中继到所有多播组成员。

--- 所以我怀疑是否有任何方法可以明确限制多播套接字的传输跳数。

--- 我的两个 UGLY 备份计划是: 1) 从发送者到它的每个 1 跳邻居的单播;或者 2)每个节点维护自己的multicastSocket,让每个邻居加入。因此,2 跳外的节点将加入不同的多播组。

但这两种解决方案都会导致创建和关闭大量套接字,并且会受到可伸缩性问题(即密度)的影响。

谁能建议任何更好的解决方案来做到这一点?基本上,关键目标是:实现无线节点的 1 跳广播功能,以向其 1 跳邻居共享本地信息。

最好的 张博

【问题讨论】:

    标签: java android sockets network-programming


    【解决方案1】:

    在 C 中,您必须为 TTL(生存时间)设置套接字选项:

    u_char ttl;
    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,sizeof(ttl))
    

    在java中你有不同的选择:

    MulticastSocket.setTimeToLive:http://docs.oracle.com/javase/7/docs/api/java/net/MulticastSocket.html#setTimeToLive(int)

    其他选项: 使用 StandardSocketOptions 类设置套接字选项:http://docs.oracle.com/javase/7/docs/api/java/net/StandardSocketOptions.html#IP_MULTICAST_TTL

    要使用 StandardSocketOptions,您需要使用 DatagramChannel: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/DatagramChannel.html

    DatagramChannel channel = DatagramChannel.open();
    int ttlValue = 1;
    channel.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttlValue);
    

    【讨论】:

    • 非常感谢您的快速回复先生!请允许我在回复您之前尝试一下。最佳
    • 我更新了我的问题。基本上 setTimeToLive(1) 似乎不起作用,因为默认值已经是 1。请问您建议的解决方案在功能方面是否相同 --- 设置生存时间?我怀疑 TTL 实际上会从一跳到另一跳减少,除了确定它是否可以超出路由器之外。
    • @ZhangBo,有没有办法可以在 B 中使用 Wireshark 或 tcpdump 嗅探网络,看看 C 是否真的从 B 接收数据报?
    • 我知道你怀疑C实际上直接偷听了A的传输,我也想过这个问题。我们正在尝试为此设置嗅探工具。希望 MAC 帧(如果被捕获)可以告诉我们一些信息。这可能需要一点时间,我会让你知道结果。提前感谢您到目前为止的帮助!
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多