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 记录 | 任意类型,一般用于查询中 |