【问题标题】:iOS Bonjour: didFindService but failed to resolve in public Wi-Fi networkiOS Bonjour:didFindService 但无法在公共 Wi-Fi 网络中解析
【发布时间】:2019-11-13 19:34:33
【问题描述】:

我可以使用NSNetServiceBrowser 在我的本地 wi-fi 中查找并解析 mDNS 服务。但是在公共Wi-Fi网络中,同样的代码只能找到服务,然后无法解析服务。

即以下委托回调成功:

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
           didFindService:(NSNetService *)aNetService
               moreComing:(BOOL)moreComing

但永远不会调用以下回调:

- (void)netServiceDidResolveAddress:(NSNetService *)sender

相反,我得到了以下调用:

- (void)netService:(NSNetService *)sender
didNotResolve:(NSDictionary<NSString *,NSNumber *> *)errorDict

而errorDict是:

{
    NSNetServicesErrorCode = "-72007";  // timeout
    NSNetServicesErrorDomain = 10;
}

为了调试,我使用WireShark捕获UDP数据包,发现有一个mDNS响应数据包,其中包含主机IP和端口的SRV记录。

我的问题是:iOS Bonjour 究竟在后台解析服务是什么?为什么在查找服务时没有公开更多信息? (公共 Wi-Fi 网络有何不同?)

iOS 版本:12 和 13

【问题讨论】:

    标签: ios bonjour


    【解决方案1】:

    大多数公共 WiFi 网络都实现了客户端隔离;它们允许您的设备与 Internet 通信,但不能与同一 wifi 网络上的其他设备通信。

    这是为了防止网络上的某人对其他设备发起攻击,这些设备可能具有通常可以通过防火墙缓解的漏洞,但会暴露给同一局域网上的设备。

    可以发现该服务,因为多播数据包被转发到所有设备(多播,如广播不针对特定设备)。

    但是,连接到服务所需的单播数据包被定向到特定设备,因此被阻止。

    在典型的客户端隔离实现中,网络会阻止 ARP 请求,这就是为什么您会收到无法解析服务地址的错误。就好像网络上根本不存在具有所需 IP 地址的设备一样。

    【讨论】:

    • 感谢您的回复。您是说在 iOS 中resolveWithTimeout 是向服务主机发送单播数据包还是 ARP 数据包?注意ARP包是广播包,不是单播。
    • resolveWithTimeout 想要向服务主机发送单播 IP 数据包。为此,iOS 上的 IP 堆栈需要解析相应的 MAC 地址。为此,它会发送一个 ARP 请求。在客户端隔离生效的情况下,网络交换机可能会阻止 ARP,或者可能会阻止来自服务主机的单播响应;有各种各样的实现,但它们都具有相同的效果
    • 使用WireShark 调试,似乎resolveWithTimeout 正在向多播地址224.0.0.251 发送查询但没有得到响应。您可能对单播在网络中被阻止是正确的,但解析查询似乎是多播。我需要挖掘更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多