【问题标题】:Which IPv6 address should I use for Bonjour?我应该为 Bonjour 使用哪个 IPv6 地址?
【发布时间】:2013-11-21 02:16:52
【问题描述】:

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

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

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

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

- 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']

那么我应该使用哪一个?是否有一些通用规则来决定注册组中的哪些地址?

【问题讨论】:

    标签: android ipv6 bonjour jmdns


    【解决方案1】:

    答案就在这四个位中。

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

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

    【讨论】:

    • 所以如果我理解正确,你是说在这种情况下我应该注册第一个和第三个地址而忽略第二个。对吗?
    • @yydl 既然您只是在与链接设备通信,那么是的,您只需要或需要使用链接本地 IPv6 地址。
    猜你喜欢
    • 2022-01-16
    • 2012-07-06
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多