什么是mDNS

本文介绍了mDNS和Avahi相关知识。mDNS可在无DNS环境让同网段设备通信,有属性、服务、查询等内容,基于UDP协议,主机开启服务后组播消息互通信息。Avahi是内网广播和查找服务的工具,安装分server和client,使用时更新速度慢,需处理服务可能不存在的情况。

https://www.logcg.com/archives/972.html

它的作用是在没有 DNS 的环境当中让相同网段里的设备互相通信

https://esp-idf-zh.readthedocs.io/zh_CN/latest/api-reference/protocols/mdns.html

  • mDNS属性
  1. 主机名(hostname): 设备将要相应的主机名
  2. 默认实例(default_instance): 设备的友好名字
  • mDNS 服务
    mDNS 可以广播你的设备所提供给的网络服务
  1. 服务(service): 所需的服务类型,使用下划线作为前缀。一些通过类型可以在 这里 找到。
  2. 协议(proto): 服务运行所需的协议,以下划线作为前缀,例如: _tcp 或者 _udp 。
  3. 端口(port): 服务运行所需的端口。
  4. 实例(instance): 服务的友好名字,例如 Jhon’s ESP32 Web Server。如果未定义,则使用 默认实例。
  5. 文本(txt): var=val 类型的字符串数组,用于为你的服务定义属性。
  • mDNS 查询
    mDNS 提供了浏览服务和解析主机 IP/IPv6 地址的方法
    结果用过一个链表对象 mdns_result_t 返回。如果结果是来自主机查询,则只包含 addr 和 addrv6(如果找到)。

  • mDNS工作原理
    首先,在 IP 协议里规定了一些保留地址,其中有一个是 224.0.0.251,对应的 IPv6 地址是 [FF02::FB]。
    mDNS 协议规定了一个端口,5353。
    mDNS 基于 UDP 协议。
    每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。
    比如,A主机进入局域网,开启了 mDNS 服务,并向 mDNS 服务注册以下信息:我提供 FTP 服务,我的IP是 192.168.1.101,端口是 21。当B主机进入局域网,并向 B 主机的 mDNS 服务请求,我要找局域网内 FTP 服务器,B主机的 mDNS 就会去局域网内向其他的 mDNS 询问,并且最终告诉你,有一个IP地址为 192.168.1.101,端口号是 21 的主机,也就是 A 主机提供 FTP 服务,所以 B 主机就知道了 A 主机的 IP 地址和端口号了。

http://pjack1981.blogspot.com/2012/07/avahi.html
Avahi 是一個在內網內, 用來廣播自己是什麼服務以及用來尋找那些服務的一個工具, 有點像是在一個社區內有個廣播系統, 大家利用他就可以找到郵局在那裡, 醫院在那裡, 而不必事先知道郵局或醫院的名字. 據了解 avahi 是利用 multicast 來做到這件事,安裝上要細分的話可以分成 server 以及 client.

在使用 avahi 要注意的一點就是他為了要降低 loading, 所以更新的速度並不是很快, 一般他都是直接從 cache 裡面抓資料給你, 所以有時你會發現有的服務不存在了, 但從 avahi-browse 還是會看到它, 所以拿到資料後, 你還是要處理有可能服務已經不存在的情況. 不過如果有新的服務加進來, 因為是主動 broadcast, 所以你一定會接到更新.

### mDNS的技术定义 mDNS(Multicast DNS,多播DNS)是一种基于UDP的网络协议,用于在本地网络中实现无需中央DNS服务器的域名解析功能。它允许设备在局域网中通过多播方式发送DNS查询请求,并由网络中的其他设备响应这些请求,从而实现主机名的解析。mDNS协议通常运行在UDP端口5353上,其设计目的是简化本地网络中的服务发现和名称解析[^1]。 ### mDNS的工作原理 mDNS的核心机制是使用IP多播来广播DNS查询请求,并由本地网络中的设备监听这些请求并作出响应。当设备需要解析某个主机名时,它会向本地网络的多播地址(如IPv4的224.0.0.251或IPv6的FF02::FB)发送一个DNS查询请求。网络中拥有该主机名的设备将接收到请求,并通过单播方式将解析结果返回给查询设备。这种方式避免了对中央DNS服务器的依赖,使得设备可以在没有配置传统DNS的情况下实现名称解析[^1]。 mDNS通常与DNS-SD(DNS Service Discovery)结合使用,以实现本地网络中的服务发现功能。例如,在一个家庭局域网中,设备可以通过mDNS发现打印机、媒体服务器或其他智能设备提供的服务。 ### mDNS的应用场景 mDNS广泛应用于本地网络中的设备和服务发现,尤其是在零配置网络(Zeroconf)环境中。一些典型的应用场景包括: 1. **智能家居设备发现**:在智能家居环境中,设备如智能灯泡、音响和摄像头可以通过mDNS自动注册和发现,使得用户无需手动配置IP地址或主机名。 2. **局域网文件共享**:在局域网中,设备可以通过mDNS发现其他设备提供的文件共享服务,例如Samba或Apple的AFP服务。 3. **打印机共享**:mDNS允许打印机在局域网中自动注册其服务,使得其他设备可以轻松发现并连接到打印机。 4. **多媒体流传输**:在家庭媒体网络中,设备可以通过mDNS发现媒体服务器(如DLNA服务器)并播放流媒体内容。 5. **开发和测试环境**:在开发和测试环境中,mDNS可以用于简化服务的发现和调试,避免复杂的网络配置。 ### 示例代码 以下是一个使用Python的`zeroconf`库实现mDNS服务发现的简单示例: ```python from zeroconf import ServiceBrowser, Zeroconf class MyListener: def remove_service(self, zeroconf, type, name): print(f"Service {name} removed") def add_service(self, zeroconf, type, name): info = zeroconf.get_service_info(type, name) print(f"Service {name} added, service info: {info}") zeroconf = Zeroconf() listener = MyListener() browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener) try: input("Press enter to exit...\n") finally: zeroconf.close() ``` 上述代码创建了一个mDNS服务浏览器,用于发现局域网中所有类型为`_http._tcp.local.`的服务,并在控制台输出服务的添加和移除信息。 ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值