【发布时间】: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