什么是mDNS(多播DNS)? .local地址与自动发现设备的原理

打印机、智能电视之所以能仅凭名字就自动找到彼此,而不需要任何DNS服务器,原理都在这里。

什么是mDNS(多播DNS)

通常要把域名解析成IP地址,需要向互联网上某台DNS服务器发起查询,但家里或办公室里的打印机、智能电视、音箱这类设备很难专门配置一台DNS服务器。mDNS让这些局域网内的设备通过多播方式广播"我的名字是这个",其他设备需要时用同样的方式发起查询并获得响应,从而在完全没有DNS服务器的情况下也能完成名称解析。

.local域名

通过mDNS查找到的设备使用".local"这个特殊的顶级域名,以便与普通域名区分开来。当打印机以类似"MyPrinter.local"的名字广播自己时,同一网络中的其他设备会自动识别出这个名字应该通过mDNS而不是普通DNS来解析。.local域名被专门保留、不会被路由到局域网之外,因此不会与真正的互联网域名体系产生冲突。

工作原理:多播查询与响应

mDNS使用UDP 5353端口,以及IPv4多播地址224.0.0.251(IPv6下为ff02::fb)。同一网络中所有支持mDNS的设备都在监听这个多播组,当收到与自己相关的名称查询时就用自己的IP地址响应。发起查询的设备会把这个响应缓存下来重复使用,并按需定期重新确认。

DNS-SD:发现服务本身的功能

与mDNS搭配使用的DNS-SD(DNS服务发现)不仅能回答"这个名字的设备在哪里",还能回答"网络中有没有提供某种服务的设备"。比如用类似"_ipp._tcp.local"这样表示服务类型的名称发起查询,网络中所有打印机都会响应,并各自报告自己的名字、端口和相关信息。正因如此,用户即使不知道打印机的确切名称或IP地址,应用程序或操作系统也能自动列出"当前可用的打印机列表"。

实际应用场景

AirPlay、屏幕镜像、无线打印机自动发现、智能家居设备初始配置等,几乎所有"自动发现设备"的功能背后都有mDNS在起作用。iPhone能自动发现附近的Apple TV并显示在AirPlay列表中,网络打印机无需安装驱动就能直接出现在列表里,智能家居App能自动发现新接入的设备,靠的都是mDNS与DNS-SD的组合。苹果的实现名为Bonjour,Linux阵营则广泛使用Avahi。

代表性实现:Bonjour、Avahi、Zeroconf

实际实现mDNS/DNS-SD标准的软件统称为Zeroconf(零配置),这个名字来自"无需任何配置就能实现网络功能"这一目标。苹果将这一概念以Bonjour之名内置到了macOS和iOS系统中;在开源阵营,Avahi在Linux发行版中扮演着相同的角色。在Windows上,安装iTunes或部分打印机驱动时,往往也会一并安装并运行Bonjour服务。

安全与注意事项

mDNS的设计不需要任何认证、任何设备都可以响应,这意味着只要处于同一网络中,不可信的设备也可能伪造名称信息进行响应。在咖啡厅、机场这类公共Wi-Fi环境中,陌生人可能与你处于同一网络,需要留意mDNS可能让自己设备的名称或服务信息暴露给周围的人。另外,mDNS原本就被设计为只在局域网内工作,不会被路由到路由器之外的其他网段,这是正常现象;如果确实需要跨网段使用,则需要额外配置mDNS中继器。

不妨也了解一下普通DNS的完整流程

如果想知道互联网上普通域名解析成IP地址的完整过程,可以参考DNS查询过程完全解析一文。

与智能家居协议的关系

Zigbee、Z-Wave等智能家居设备使用的其他无线协议,可以参考智能家居网络协议完全解析一文进一步了解。

常见问题

mDNS无法正常工作会怎样?

设备将无法再按名称自动被发现,可能需要在App或设置界面里手动输入IP地址来添加打印机或智能电视。路由器的多播相关设置,或者AP隔离(客户端隔离)功能,经常是阻断mDNS流量的原因,值得优先排查。

mDNS在没有互联网连接的情况下也能用吗?

可以。mDNS只在同一个局域网内工作,即使断开了互联网连接,只要设备连接在同一个Wi-Fi或路由器下,彼此依然能够互相发现。