Skip to content

mDNS 协议

1. 什么是 mDNS 协议

在计算机网络中,组播 DNS(multicast DNS,mDNS)协议在没有 DNS 服务器的小型网络中,将主机名解析为 IP 地址。它是一种零配置服务,使用与单播域名服务(DNS)基本相同的编程接口、数据包格式和操作语义。它被设计为作为一个独立的协议或与标准的 DNS 服务器兼容。[1]

它使用 IP 组播 UDP 数据包,并由苹果 Bonjour 和开源 Avahi 软件包实现,包括在大多数 Linux 发行版中。mDNS 可以与 DNS-SD 一起工作。[2]

每个进入局域网的主机,如果开启了 mDNS 服务的话,都会向局域网内的所有主机组播消息,自身的名称信息和 IP 地址。然后其他也有该服务的主机就会响应,也会发送自身名称信息和 IP 地址。

mDNS 与 DNS-SD

mDNS 协议规定了消息的基本格式和消息的收发的基本顺序,DNS-SD 协议在这基础上,首先对实例名,服务名称,域名长度或顺序等作出了具体的定义,然后规定了如何方便地进行服务发现和描述。

详情阅读 DNS-SD 协议

2. 为什么使用 mDNS

在局域网中,设备和设备之前相互通信需要知道对方的 IP 地址的。大多数情况,设备的 IP 不是静态 IP 地址,而是通过 DHCP 协议动态分配的 IP 地址,要进行通信,就必须知道对方的 IP 地址。

当我们不知道 IP 地址时,就无法直接和局域网的目标通信,mDNS 的作用就是解决这个问题。mDNS 可以像 DNS 一样通过名称得到目标主机的 IP 地址,但是这个名称必须是 .local 结尾的名称。

3. 消息格式

mDNS 遵循了 DNS 协议规范,使用现有的 DNS 信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。

mDNS 消息是一个组播 UDP 数据包,使用以下地址发送:

  • IPv4:224.0.0.251
  • IPv6:FF02::FB
  • UDP 端口:5353
  • 当使用以太网帧时,标准的 IP 组播 MAC 地址 01:00:5E:00:00:FB(IPv4)或 33:33:00:00:00:FB(IPv6)。

有效载荷结构基于单播 DNS 数据包格式,由两部分组成——头和数据。

报头与单播 DNS 中的报头相同,数据部分的子部分也相同:查询、回答、授权 DNS 服务器和附加记录。每个子部分的记录数与头中相应的 *COUNT 字段的值一致。

3.1 记录格式

记录类别作用
A 记录主机名称和 IPV4 之间的对应关系
AAAA 记录主机名称和 IPV6 之间的对应关系
SRV 记录标识服务实例名称对应哪一个主机名和端口号
PTR 记录标识服务实例名称和服务类型之间的对应关系
TXT 记录对某个服务实例提供的附加信息,按照 K/V 形式给出
ANY 记录任意类型,一般用于查询中

  1. https://datatracker.ietf.org/doc/html/rfc6762 ↩︎

  2. https://en.wikipedia.org/wiki/Multicast_DNS ↩︎