- mdns(Multicast DNS)/dns-sd(DNS Service Discovery)
支持名字解析和服务发现,由苹果公司最早提出,苹果所有设备和Windows10以上版本默认支持mdns协议,Ubuntu/debian通过libnss的插件nss-mdns提供支持,但没有默认启用。
mdns使用组播协议进行名字解析,解析到的名字统一放到.local域下。dns-sd是mdns的扩展,与mdns兼容,不但支持组播还支持使用单播进行解析,可以配置自定义域名后缀并与DNS服务器配置完成域名解析,更适合企业环境中使用。
mdns/dns-sd使用UDP协议,5353端口。 - SSDP(upnp)
仅服务发现,没有名字解析功能,ssdp是upnp的组成部分,支持IPv4和IPv6。使用HTTPU/HTTPMU(基于UDP) 1900端口。UPNP提供了设备和服务发现,设备信息获取,设备控制功能,甚至提供了NAT穿透功能,可以作为智能家居设备的底层协义,DLNA投屏协义也是基于UPNP。 - NBNS(NetBIOS Name Service)/WINS
不支持IPv6,已经废弃。NetBIOS是一项古老的协议,由IBM开发。WINS是由微软开发的基于NBNS的协议,WINS支持单播,而且支持域名后缀并与DNS服务器集成,更适合企业环境中使用,类似dns-sd与mdns的关系。Windows10以上版本已经废弃NetBIOS的服务发现功能,取而代之的是WSSD和LLMNR(MDNS的支持似乎还不完整,只有名字解析,没有服务发现)。
nbns/wins使用UDP/TCP协议,137端口。 - LLMNR(Link-Local Multicast Name Resolution)
也是提供基于多播协议的DNS解析功能,但仅提供名字解析,没有服务发现功能,与mdns非常类似,由微软件开发因未竞争过mdns所以未成为正式IETF正式标准。LLMNR使用UDP 5355端口。自 2022 年 4 月起,微软已开始逐步淘汰 LLMNR 和NetBIOS名称解析,转而使用mDNS。LLMNR落败的主要原因是没有与普通DNS解析的名称进行区分,导致LLMNR的名字会污染普通的DNS名字造成安全隐患,mdns则是用.local后缀作区分。 - DDNS(Dynamic Updates in the Domain Name System)
即动态DNS,与DHCP配合使用,由DHCP服务器把主机名注册到DNS服务器。缺点是静态IP地址就没法用了。
参考:
LLMNR
https://datatracker.ietf.org/doc/rfc4795/
这篇文章讲解了LLMNR与MDNS的竞争
https://www.eiman.tv/blog/posts/lannames/
Multicast DNS
https://datatracker.ietf.org/doc/rfc6762/
DNS Service Discovery
https://datatracker.ietf.org/doc/rfc6763/
http://www.dns-sd.org/
DDNS
https://datatracker.ietf.org/doc/rfc2136/
libnss的d-bus接口
https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.resolve1.html
cups支持systemd-dnssd的issue
https://github.com/OpenPrinting/libcups/issues/81
wikipedia的介绍
https://en.wikipedia.org/wiki/Zero-configuration_networking