我应该为Bonjour使用哪个IPv6地址?

时间:2013-11-21 02:16:52

标签: android ipv6 bonjour jmdns

在我的一个Android应用中,我正在使用JmDNS进行Bonjour支持。启动时,我为NetworkInterface中的每个InetAddress创建一个JmDNS实例。所以代码看起来像:

for(InetAddress addr : addresses) {
    JmDNS jmdns = JmDNS.create(addr, "SomeName");
}

到目前为止效果很好,通过对v4和v6地址执行此操作,我可以从其他客户端(例如在iOS上)正确查看所有内容。

但是,使用IPv6,一个网络适配器实际上可以与多个v6地址关联。因此,例如,我的一位测试人员向我发送了一个“错误报告”,其中包含以下网络设置(我已更改了一些数字以防止泄露信息 - 希望它不会改变含义):

- ip: /fe80::b4a:8eff:fe91:b1bb%mlan0
isLoopBack: false
isLinkLocal: true
isAnyLocal: false
isSiteLocal: false

- ip: /1234:d000:1234:d1:b4a:8eff:fe91:b1bb
isLoopBack: false
isLinkLocal: false
isAnyLocal: false
isSiteLocal: false

- ip: /10.0.1.5
isLoopBack: false
isLinkLocal: false
isAnyLocal: false
isSiteLocal: true

查看该输出,看起来两个IPv6地址实际上非常相似,可能一个是链路本地而另一个不是。阅读article on Wikipedia,我能够理解,在IPv6中,所有接口实际上也必须具有链接本地地址。

但是,我很难知道我的JmDNS注册中实际使用哪两个。如果我同时注册,我会得到一个连续的日志流:

  

与我们自己的探索相互矛盾   传入:[x @ 123456789类型:TYPE_SRV索引33,类:CLASS_IN索引1,名称:something._tcp.local。 ttl:'3599/3600'服务器:'SomeName.local。:5000']

我应该使用哪一个?是否有一些通用规则来决定从哪个地址注册?

1 个答案:

答案 0 :(得分:1)

答案是这四位。

环回对Bonjour不利,所以消除环回。对于Bonjour,你需要一个本地地址,因为Bonjour本质上是本地的,但如果有多个以太网,你可能想要所有。因此,我建议如果有一个sitelocal地址你采取,否则采取linklocal地址。 linklocal保证在那里。

当您获得地址时,请注意其preferred_lft(即新连接的生命周期,现有连接的valid_lft也更长),并设置一个计时器以在该时间段后重新注册。