关于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:

}

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wireshark是一个开放源代码的网络封包分析软件,可用于捕获和分析网络数据包。你可以在本机上使用Wireshark来捕获通过本机的数据流量。引用 MDNS(Multicast DNS)是一种用于在局域网中发现和解析网络设备的服务。它使用特定的网络协议来实现设备之间的通信。如果你想使用Wireshark来捕获和分析MDNS数据包,你可以使用过滤器"mdns"来只捕获与MDNS相关的数据包。这样,你就可以观察局域网中设备之间的MDNS通信。引用 要使用Wireshark来抓取MDNS数据包,你需要按照以下步骤进行操作: 1. 首先,确保你已经安装了最新版本的Wireshark。你可以从官方网站下载安装包并按照指示进行安装。引用 2. 打开Wireshark软件,并选择你想要抓取数据包的网络接口。这可以是你的无线网卡或以太网接口。 3. 在过滤器框中输入"mdns",以只捕获与MDNS相关的数据包。这将过滤掉其他类型的数据包,使你能够更好地分析MDNS通信。引用 4. 点击"Start"按钮开始捕获数据包。Wireshark将开始监听指定的网络接口,并显示捕获到的数据包列表。 5. 当你希望停止捕获数据包时,点击"Stop"按钮。然后,你可以使用Wireshark的分析功能来查看和解析捕获到的MDNS数据包。引用 如果你对Wireshark的使用和MDNS的分析更加详细的了解,可以参考一些提供了相关信息的文章。其中包括提到的《Wireshark的下载安装及简单使用教程》和提到的《WireShark抓包分析》。这些文章将为你提供更多关于Wireshark和MDNS的信息和指导。引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值