什么是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中继器。