网络协议之mDNS

本文介绍了mDNS(多播DNS)的概念及工作原理,解释了它如何帮助局域网内的设备互相发现和通信,尤其是在没有传统DNS服务器的情况下。同时,文中还探讨了mDNS与Apple的Bonjour技术之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,
而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
DNS协议运行在UDP协议之上,使用端口号53。
在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。

一、mDNS
mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,
使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。
在局域网中,设备和设备之前相互通信需要知道对方的ip地址的,
大多数情况,设备的ip不是静态ip地址,而是通过dhcp协议动态分配的ip 地址,如何设备发现呢,就是要mdns大显身手,
例如:现在物联网设备和app之间的通信,要么app通过广播,要么通过组播,发一些特定信息,感兴趣设备应答,
实现局域网设备的发现,当然mdns 比这强大的多
1.mDNS 基于UDP 协议
组播地址: 组播地址使用的是D类地址,地址范围为:224.0.0.0—239.255.255.255
2.mdns工作原理简单描述:
mdns 使用组播地址为: 224.0.0.251 (ipv6: FF02::FB) 端口为5353,mdns是用于局域网内部的,并且主机的域名为.local 结尾,每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁(域名),和我的IP地址是多少。然后其他有mdns服务的主机就会响应,也会告诉你,它是谁(域名),它的IP地址是多少。
当然设备需要服务时,就是使用mdns 查询域名对对应的ip地址,
对应的设备收到该报文后同样通过组播方式应答,
此时其他主机设备也是可以收到该应答报文,其他主机也会记录域名和ip 以及ttl 等,更新缓存
比如,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 地址和端口号了。
大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。
3.mDNSResponder与Bonjour的关系:
The mDNSResponder project is a component of Bonjour,
Apple's ease-of-use IP networking initiative:
Bonjour是法语中的Hello之意。它是Apple公司为基于组播域名服务(multicast DNS)的开放性零配置网络标准所起的名字。
使用Bonjour的设备在网络中自动组播它们自己的服务信息并监听其它设备的服务信息。
设备之间就像在打招呼,这也是该技术命名为Bonjour的原因。
Bonjour使得局域网中的系统和服务即使在没有网络管理员的情况下也很容易被找到。

举一个简单的例子:在局域网中,如果要进行打印服务,必须先知道打印服务器的IP地址。此IP地址一般由IT部门的人负责分配,然后他还得全员发邮件以公示此地址。有了Bonjour以后,打印服务器自己会依据零配置网络标准在局域网内部找到一个可用的IP并注册一个打印服务,名为“print service”之类的。当客户端需要打印服务时,会先搜索网络内部的打印服务器。
由于不知道打印服务器的IP地址,客户端只能根据诸如"print service"的名字去查找打印机。

在Bonjour的帮助下,客户端最终能找到这台注册了“print service”名字的打印机,并获得它的IP地址以及端口号。

备注:随笔中内容来源于网上资料整理,仅供参考。

转载于:https://www.cnblogs.com/Alanf/p/8653223.html

### MDNS协议详解 多播DNS(Multicast DNS, mDNS)是一种通过局域网内的组播机制解析主机名到IP地址的技术。mDNS允许设备在网络中广播自己的存在,并响应其他设备对于特定名称的查询请求,而无需依赖集中式的DNS服务器。 #### 协议工作原理 - **域名空间**:mDNS使用`.local`作为顶级域名后缀表示本地链路范围内的资源。 - **消息格式**:遵循标准DNS报文结构,但是采用224.0.0.251(IPv4)或多播地址ff02::fb(IPv6)进行传输。 - **冲突检测**:当两个或多个节点尝试注册相同的全限定域名(FQDN),它们会互相通知对方并重新选择新的唯一标识符[^1]。 ### 使用C语言实现简单的MDNS客户端 下面是一个简化版的例子展示如何利用Berkeley套接字API创建一个多播监听器来接收来自同一子网上其它机器出的服务公告: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define MULTICAST_ADDR "224.0.0.251" #define PORT 5353 int main() { int sockfd; struct sockaddr_in local_addr, from_addr; socklen_t addrlen = sizeof(from_addr); /* 创建UDP socket */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&local_addr, 0, sizeof(local_addr)); local_addr.sin_family = AF_INET; local_addr.sin_port = htons(PORT); local_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 绑定端口 */ bind(sockfd , (const struct sockaddr *) &local_addr, sizeof(struct sockaddr)); char buffer[1024]; while(1){ recvfrom(sockfd, (char*)buffer, 1024, MSG_WAITALL, (struct sockaddr*)&from_addr,&addrlen); printf("Message received: %s\n", buffer); } } ``` 此代码片段展示了基本框架,实际应用还需要加入更多功能如送查询请求、处理回复数据包等逻辑[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值