关于mDNS

在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的 ip 地址,但是有些时候,你并不知道对方的 ip 地址,因为一般使用 DHCP 动态分配 ip 地址的局域网内,各个主机的 IP 地址是由 DHCP 服务器来帮你分配 IP 地址的。所以在很多情况下,你要知道对方的 IP 地址是比较麻烦的。

mDNS即组播DNS(multicast DNS)。使用5353端口,在内网没有DNS服务器时,就会出现此组播信息。

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 地址和端口号了。

大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。

在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。

这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。

ESP8266 中的实现

以下的示例是用一个ESP8266在当前内网中注册一个mDNS服务,另外查询网内有哪些可以使用的mDNS,并将其全部打印出来。

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>

const char* ssid     = "...";
const char* password = "...";
char hostString[16] = {0};

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("\r\nsetup()");

  sprintf(hostString, "ESP_%06X", ESP.getChipId());
  Serial.print("Hostname: ");
  Serial.println(hostString);
  WiFi.hostname(hostString);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

 if (!MDNS.begin(hostString)) {
    Serial.println("Error setting up MDNS responder!");
  }
  Serial.println("mDNS responder started");
  MDNS.addService("esp", "tcp", 8080); // Announce esp tcp service on port 8080

  Serial.println("Sending mDNS query");
  int n = MDNS.queryService("esp", "tcp"); // Send out query for esp tcp services
  Serial.println("mDNS query done");
  if (n == 0) {
    Serial.println("no services found");
  }
  else {
    Serial.print(n);
    Serial.println(" service(s) found");
    for (int i = 0; i < n; ++i) {
      // Print details for each service found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(MDNS.hostname(i));
      Serial.print(" (");
      Serial.print(MDNS.IP(i));
      Serial.print(":");
      Serial.print(MDNS.port(i));
      Serial.println(")");
    }
  }
  Serial.println();
  
  Serial.println("loop() next");
}

void loop() {
  // put your main code here, to run repeatedly:

}

本文还在持续更新中,后续内容还敬请关注

03-08
<think>好的,我现在要处理用户关于mDNS的问题。用户之前问过负载均衡服务器和报文重构的关系,现在转向mDNS,可能是在学习网络协议,或者是在搭建本地网络服务,比如智能家居或IoT设备。我需要先回忆mDNS的基本概念,然后组织信息,用中文回答。 首先,mDNS的全称是Multicast DNS,主要用于局域网内的设备发现和服务解析,不用依赖传统的DNS服务器。用户可能想知道它的工作原理、应用场景以及与普通DNS的区别。需要解释清楚这些点,并且给出实际例子,比如苹果的Bonjour或者智能家居设备的使用。 用户可能没有说出来的需求是,他们可能遇到了局域网设备无法自动发现的问题,或者想了解如何实现零配置网络。需要确保回答覆盖这些潜在的问题,并提供足够的技术细节,比如端口号5353,使用的多播地址,以及协议如何工作。 还要注意用户之前的回答结构,使用清晰的标题和表格,所以这次也要保持类似的格式,但不需要太复杂。要分点说明,可能包括定义、工作原理、应用场景、与DNS的对比、技术细节以及常见问题。 需要检查是否有技术细节错误,比如mDNS是否真的使用UDP,端口是否正确,多播地址是否正确。同时,要提到兼容性,比如不同操作系统或设备的支持情况,以及可能的安全考虑,比如未经认证的服务发现可能带来的风险。 最后,用实际例子帮助用户理解,比如打印机发现或智能家居设备互联,这样用户能更好地联系实际应用。确保语言通俗易懂,避免过于专业的术语,但必要时给出术语解释。</think>### **mDNS(组播DNS)技术解析** mDNS(Multicast DNS)是一种**零配置网络协议**,用于在局域网(LAN)中实现设备和服务发现,**无需传统DNS服务器**。它通过组播通信实现本地设备的自动识别和地址解析,典型应用场景包括智能家居、打印机发现、IoT设备互联等。 --- ### **1. mDNS的核心特性** | **特性** | **说明** | |---------------------|-------------------------------------------------------------------------| | **工作层级** | 应用层协议(基于UDP) | | **默认端口** | 5353 | | **组播地址** | IPv4:`224.0.0.251`,IPv6:`FF02::FB` | | **协议目标** | 解决局域网内无中心DNS服务器时的服务发现 | | **典型实现** | Apple Bonjour、Avahi(Linux)、Windows 10+ 内置支持 | --- ### **2. mDNS工作原理** #### **(1) 服务注册** - 设备启动时,向组播地址广播自身服务(如`_http._tcp.local`)。 - 示例报文: `设备A`发送:`"我的服务是Web服务器,地址是device-a.local:80"`。 #### **(2) 服务查询** - 设备需要访问服务时,发送组播查询请求。 示例:`设备B`发送:`"谁提供_http._tcp服务?"`。 - 目标服务响应:`设备A`单播回复自身IP和端口。 #### **(3) 冲突检测** - 若多个设备声明相同域名(如`printer.local`),mDNS通过**冲突仲裁**机制协商唯一名称。 --- ### **3. mDNS与普通DNS的差异** | **对比维度** | **mDNS** | **传统DNS** | |---------------------|-----------------------------------------|-------------------------------------| | **依赖服务器** | 无需服务器,完全分布式 | 需要中心化DNS服务器 | | **查询范围** | 仅限于局域网 | 可解析互联网域名 | | **协议效率** | 组播可能产生较多网络流量 | 单播查询,流量更可控 | | **典型用途** | 本地设备发现(如智能家居) | 互联网域名解析 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值