最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

关于mDNS

IT培训 admin 2浏览 0评论

关于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 8080Serial.println("Sending mDNS query");int n = MDNS.queryService("esp", "tcp"); // Send out query for esp tcp servicesSerial.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 foundSerial.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:}

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

关于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 8080Serial.println("Sending mDNS query");int n = MDNS.queryService("esp", "tcp"); // Send out query for esp tcp servicesSerial.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 foundSerial.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:}

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

11136

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论