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 ↩︎