我正在编写一个可以在计算机和手机上运行的软件。

该服务使用 HTTP API 进行通信,并将使用 Zeroconf 在本地网络上发布。

最初我使用发布我的服务 _http._tcp. 作为服务类型,但我很快发现我的 NAS 和音乐接收器(!)也使用该确切的服务类型进行广播。

现在的问题是如何区分我的服务和其他使用 HTTP 的服务。

备择方案

使用不同的服务类型

这当然是最简单的方法,并且(几乎)保证不会选择其他服务。

不过,根据苹果公司的说法1 新服务 应该 已向 IANA 注册。这显然不是必需的,但看到他们推荐的方式,感觉这是错误的做法

使用TXT记录

苹果2 TXT记录是这样描述的:

注册服务时,会创建三个相关的 DNS 记录:服务(SRV)记录、指针(PTR)记录和文本(TXT)记录。TXT 记录包含解析或使用服务所需的附加数据,尽管它通常也是空的。

当然感觉这可能是正确的方法,但我仍然不确定,并且很难找到该字段应包含的内容的描述。

我的第一个想法是放一些类似的东西 <service_name>-<version> 然后将对其进行解析以查看它实际上是哪个服务。

我的 NAS 似乎用它来识别型号和版本号。

尝试与服务人员交谈

找到服务后,人们总是可以执行 HEAD 在已知端点上请求并查找服务设置的已知标头。

这感觉是一个相当缓慢的方法,谁知道如何制作一个 HEAD 向我的接收者请求即可。


需要明确的是,这个问题与特定语言或框架无关,它与 Zeroconf 的概念有关。

我可以展示一些代码,但我不知道这有什么帮助。

有帮助吗?

解决方案

首先,您所宣传的服务是否确实符合资格 _http 定义为 RFC 2782. 。具体来说,它不仅使用 HTTP 进行传输,而且还:

  • 可以通过“典型”网络浏览器客户端软件显示,并且
  • 主要供人类用户查看。

如果不是,请注册您自己的服务类型(还有一些其他服务使用 HTTP 作为传输,但不满足这些条件,因此它们有 -http 作为服务名称的后缀,请参阅 pgpkey-http, senteo-http, xul-http).

如果是,有几种方法可以选择,具体取决于人们对 RFC 的解释有多严格。最不严格的只是添加一个 TXT 正如您在问题中已经指出的那样进行记录。iTunes 将自身注册到 TXT 以格式记录 iTSh Version=196618.

如果您感觉更严格一点,RFC 仅明确指出 u=, p=path= HTTP 存在 TXT 记录。也许有人可以插话,但我还没有看到太多关于将 TXT 记录添加到现有条目是否会被反对的讨论。因此,另一种方法就是仅使用算法实例名称。例如,在设备名称中添加后缀“-NicklasAService”。希望给它一个本地网络唯一的名称,但仍然这样,这样只需查找后缀就可以通过 PTR 记录轻松地挑选出该服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top