gpt4 book ai didi

java - 如何将多播范围明确限制为仅 1 跳?

转载 作者:太空狗 更新时间:2023-10-29 14:04:17 28 4
gpt4 key购买 nike

这是我的第一个问题,所以如果我问错了,我很抱歉。

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

我的问题是,更远的节点也在接收它。

考虑这个例子:

A----B----C

同时:

A----D

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

我想要的是:如果A发送,B和D都能收到,C不行;如果 B 发送,A 和 C 可以接收,但 D 接收不到。基本上就是所谓的“1-hop 广播”。

我得到的是:如果 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 连接的无线节点,网络可以被视为单个“本地网络”,因此可以中继到所有多播组成员。

--- 所以我怀疑是否有任何方法可以显式限制 multicastSocket 的传输跳数。

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

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

任何人都可以提出更好的解决方案吗?基本上,关键目标是:实现无线节点的 1 跳广播功能,以将本地信息共享给其 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);

关于java - 如何将多播范围明确限制为仅 1 跳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647990/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com