网络协议学习-mDNS

article/2025/9/18 5:39:43

前面在学习局域网设备发现的时候,学习了UPnP协议,学习到了里面的设备发现协议SSDP,SSDP设备发现。
最近又发现了一种常见的协议,用来发现局域网内的设备及服务,就是mDNS协议,这是一种零配置服务。
mDNS即多播DNS(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。
在局域网中,设备和设备之前相互通信需要知道对方的ip地址的,大多数情况,设备的ip不是静态ip地址,而是通过dhcp 协议动态分配的ip 地址,如何设备发现呢,就是要mDNS大显身手,例如:现在物联网设备和app之间的通信,要么app通过广播,要么通过组播,发一些特定信息,然后某些设备应答,实现局域网设备的发现,当然mDNS比这强大的多。

mDNS 基于 UDP 协议

组播地址: 组播地址使用的是D类地址,地址范围为:224.0.0.0—239.255.255.255

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 地址和端口号了。这是一个有感情的打印机
通过抓取报文,可以发现他们的交流方式,就是通过多播的方式,端口为5353。
在这里插入图片描述
不知道是什么情况,报文是黑红色,感觉像是有些问题。但是逻辑上来看是和之前的描述类似,本机是192.168.32.202,首先上线,发送了自己的信息,然后本网络内的192.168.32.254设备做出了响应,返回了自己的属性,然后202又发送了自己的信息,最后254也返回了自己的所有服务。
(纯属猜测),等学习完DNS协议回来再做更改。

在linux下,测试mDNS,利用的avahi工具组合,其中最重要的就是avahi-browse命令
在这里插入图片描述
下面是一个测试返回结果

[root@localhost ~]# avahi-browse -a -r -t -v
服务器版本:avahi 0.6.31;主机名:linux.local
E Ifce Prot 名称                                        类型               域
+ enp1s0 IPv4 Jenkins [00:50:56:b8:80:44]                   Workstation          local
+ enp1s0 IPv4 linux [94:09:d3:10:33:49]                     Workstation          local
+ enp1s0 IPv4 ubuntu [00:0c:29:80:19:3f]                    Workstation          local
+ enp1s0 IPv4 linux-2 [f0:d4:e2:e8:e4:40]                   Workstation          local
+ enp1s0 IPv4 Canon iR2004/2204                             _scanner._tcp        local
+ enp1s0 IPv4 Canon iR2004/2204                             _uscan._tcp          local
+ enp1s0 IPv4 Canon iR2004/2204                             _ipps._tcp           local
+ enp1s0 IPv4 Canon iR2004/2204                             Internet Printer     local
+ enp1s0 IPv4 Canon iR2004/2204                             Web Site             local
+ enp1s0 IPv4 Canon iR2004/2204                             UNIX Printer         local
+ enp1s0 IPv4 Canon iR2004/2204                             PDL Printer          local
= enp1s0 IPv4 linux-2 [f0:d4:e2:e8:e4:40]                   Workstation          localhostname = [linux-2.local]address = [192.168.32.200]port = [9]txt = []
= enp1s0 IPv4 Jenkins [00:50:56:b8:80:44]                   Workstation          localhostname = [Jenkins.local]address = [192.168.32.7]port = [9]txt = []
= enp1s0 IPv4 linux [94:09:d3:10:33:49]                     Workstation          localhostname = [linux.local]address = [192.168.32.202]port = [9]txt = []
= enp1s0 IPv4 ubuntu [00:0c:29:80:19:3f]                    Workstation          localhostname = [ubuntu.local]address = [192.168.32.231]port = [9]txt = []
= enp1s0 IPv4 Canon iR2004/2204                             PDL Printer          localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [9100]txt = ["UUID=01c80000-fe7f-11de-8a39-f80d60b8c6d4" "PaperMax=tabloid-A3" "Punch=0" "Staple=F" "Sort=T" "Collate=T" "Bind=F" "PaperCustom=T" "Duplex=T" "Copies=T" "Color=F" "TBCP=F" "Binary=F" "Transparent=F" "usb_MDL=iR2004/2204" "usb_MFG=Canon" "adminurl=http://Canonb8c6d4.local:80/portal_top.html" "pdl=application/octet-stream" "product=(CNiR2004/2204)" "ty=Canon iR2004/2204" "priority=10" "qtotal=1" "note=" "txtvers=1"]
= enp1s0 IPv4 Canon iR2004/2204                             UNIX Printer         localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [515]txt = ["UUID=01c80000-fe7f-11de-8a39-f80d60b8c6d4" "PaperMax=tabloid-A3" "Punch=0" "Staple=F" "Sort=T" "Collate=T" "Bind=F" "PaperCustom=T" "Duplex=T" "Copies=T" "Color=F" "TBCP=F" "Binary=F" "Transparent=F" "usb_MDL=iR2004/2204" "usb_MFG=Canon" "adminurl=http://Canonb8c6d4.local:80/portal_top.html" "pdl=application/octet-stream" "product=(CNiR2004/2204)" "ty=Canon iR2004/2204" "priority=10" "qtotal=1" "note=" "rp=auto" "txtvers=1"]
= enp1s0 IPv4 Canon iR2004/2204                             Web Site             localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [80]txt = ["path=/"]
= enp1s0 IPv4 Canon iR2004/2204                             Internet Printer     localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [631]txt = ["kind=document,envelope,label" "mopria-certified=1.2" "print_wfds=T" "URF=V1.4,W8,RS300,IS19-20-21,OB10,CP255,DM1,IFU0,PQ4" "usb_CMD=LIPSLX,CPCA" "UUID=01c80000-fe7f-11de-8a39-f80d60b8c6d4" "TLS=1.2" "air=none" "PaperMax=tabloid-A3" "Punch=0" "Staple=F" "Sort=F" "Collate=F" "Bind=F" "PaperCustom=T" "Duplex=T" "Copies=T" "Fax=F" "Scan=T" "Color=F" "usb_MDL=iR2004/2204" "usb_MFG=Canon" "adminurl=http://Canonb8c6d4.local:80/airprint.html" "pdl=application/octet-stream,application/pdf,image/jpeg,image/pwg-raster,image/urf" "product=(CNiR2004/2204)" "ty=Canon iR2004/2204" "priority=5" "qtotal=1" "note=" "rp=ipp/print" "txtvers=1"]
= enp1s0 IPv4 Canon iR2004/2204                             _ipps._tcp           localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [443]txt = ["kind=document,envelope,label" "mopria-certified=1.2" "print_wfds=T" "URF=V1.4,W8,RS300,IS19-20-21,OB10,CP255,DM1,IFU0,PQ4" "usb_CMD=LIPSLX,CPCA" "UUID=01c80000-fe7f-11de-8a39-f80d60b8c6d4" "TLS=1.2" "air=none" "PaperMax=tabloid-A3" "Punch=0" "Staple=F" "Sort=F" "Collate=F" "Bind=F" "PaperCustom=T" "Duplex=T" "Copies=T" "Fax=F" "Scan=T" "Color=F" "usb_MDL=iR2004/2204" "usb_MFG=Canon" "adminurl=http://Canonb8c6d4.local:80/airprint.html" "pdl=application/octet-stream,application/pdf,image/jpeg,image/pwg-raster,image/urf" "product=(CNiR2004/2204)" "ty=Canon iR2004/2204" "priority=10" "qtotal=1" "note=" "rp=ipp/print" "txtvers=1"]
= enp1s0 IPv4 Canon iR2004/2204                             _uscan._tcp          localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [80]txt = ["duplex=T" "is=platen,adf" "cs=color,grayscale" "UUID=01c80000-fe7f-11de-8a39-f80d60b8c6d4" "pdl=application/octet-stream,application/pdf,image/jpeg" "note=" "ty=Canon iR2004/2204" "rs=eSCL" "representation=http://Canonb8c6d4:80/media/icon_128x128.png" "adminurl=http://Canonb8c6d4:80/index.html" "vers=2.5" "txtvers=1"]
= enp1s0 IPv4 Canon iR2004/2204                             _scanner._tcp        localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [8610]txt = ["scannerAvailable=1" "MDL=iR2004/2204" "MFG=Canon" "UUID=F80D60B8C6D4" "ty=Canon iR2004/2204" "adminurl=http://Canonb8c6d4.local:80/airprint.html" "note=" "txtvers=1"]
:缓存用尽
+ enp1s0 IPv4 Canon iR2004/2204                             _privet._tcp         local
= enp1s0 IPv4 Canon iR2004/2204                             _privet._tcp         localhostname = [Canonb8c6d4.local]address = [192.168.32.254]port = [80]txt = ["cs=offline" "id=" "type=printer" "url=https://www.google.com/cloudprint" "note=" "ty=Canon iR2004/2204" "txtvers=1"]
:当前所有

其中+开头的是总述,-开头的是详细描述。
总述里面按照表头,可以看到设备所在的域和设备类型。详细描述里面,可以看到设备开启的每个服务与对应端口。
设备类型通过avahi-browse -b命令可以获得

PulseAudio Sound Server
PostgreSQL Server
Apple TimeMachine
WebDAV File Share
Timbuktu Remote Desktop Control
Adobe Acrobat
VNC Remote Access
Workstation
Digital Photo Sharing
Mumble Server
APT Package Repository
Virtual Machine Manager
SSH Remote Terminal
Subversion Revision Control
Telnet Remote Terminal
IMAP Mail Access
RTP Realtime Streaming Server
Secure WebDAV File Share
iTunes Remote Control
Apple AirPort
UNIX Printer
SFTP File Transfer
DVD or CD Sharing
Remote Disk Management
iChat Presence
Posta - POP3
Asterisk Exchange
Web Syndication RSS
Adobe Version Cue
Window Shifter
PDL Printer
Apple Home Sharing
DNS Server
Microsoft Windows Network
VLC Streaming
OmniWeb Bookmark Sharing
iTunes Audio Access
KDE System Guard
GnuPG/PGP HKP Key Server
Distributed Compiler
Bazaar
iPod Touch Music Library
Secure Web Site
Web Site
Thousand Parsec Server (Secure HTTP Tunnel)
NTP Time Server
Skype VoIP
AirTunes Remote Audio
Apple Net Assistant
PulseAudio Sound Sink
Network File System
H.323 Telephony
OLPC Presence
Thousand Parsec Server (Secure)
RealPlayer Shared Favorites
RTSP Realtime Streaming Server
PulseAudio Sound Source
Apple File Sharing
Remote Jukebox
Internet Printer
TFTP Trivial File Transfer
Music Player Daemon
Gobby Collaborative Editor Session
Thousand Parsec Server (HTTP Tunnel)
SIP Telephony
LDAP Directory Server
MacOS X Duplicate Machine Suppression
Thousand Parsec Server
FTP File Transfer
SubEthaEdit Collaborative Text Editor

从前面这段消息中,我们就可以简单的发现,192.168.32.254这个打印机,开启了多个打印服务,对应不同的端口。
通过更换为参数-p,可以得到如下分号分割的方便解析的结果
在这里插入图片描述
服务的发布可以参考一位博主的文章
avahi发送mdns服务

刚刚过完中秋节,三天下了两天雨,疫情又有所抬头,希望不要影响大家国庆回家,让在外漂泊的孩子们都能回家看看吧。


http://chatgpt.dhexx.cn/article/sxrb93cB.shtml

相关文章

mysql数据库备份 dump,使用mysqldump对数据库备份和恢复

数据库存储引擎:InnoDB 启用binlong 一、恢复误删除的数据库到最新状态 1、备份数据库 mysqldump -A -F -uroot -p --master-data2 --single-transaction > /backups/all-date %F_%T.sql 2、对数据库误删除 MariaDB [reset_gq]> drop database reset_gq; 3、对…

MySQL全量备份和增量备份

MySQL目前是市面上比较流程的关系型数据库,很多人使用MySQL里的数据真的安全吗?如果发生以下问题的话: MySQL数据目录所在磁盘损坏MySQL服务器发生故障人为操作失误导致删除了一些数据黑客入侵导致数据被攻陷等问题 这个时候如果没有备份数…

mysql备份test数据库_mysql和test数据库

安装mysql yum -y install mysql mysql-server mysql-devel service mysqld startmysqladmin -uroot -p password "123456"mysql -uroot -pshow databases; use mysql; sho... 文章 weibinwps 2017-12-25 983浏览量 mysql导入和导出数据 Linux下如何单个库进行导入和…

app服务器 数据库文件,app访问服务器mysql数据库文件

app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制,用来提高实例的稳定性和安全性,具体详见表1。 对于mysqlpump工具,由于在并行备份场景有coredump问题,不建议您使用,推…

定时备份MYSQL数据库

首先查看磁盘情况,选择空间充足的磁盘空间,避免出现因空间不足导致备份失败 df -h 这里选择磁盘较大的,app 创建备份目录 cd /app mkdir bkdatabase cd bkdatabase 创建备份的shell脚本 vim backmysql.sh 添加内容: #!/bi…

MYSQL数据库(八)数据库备份和恢复

成功不易,加倍努力! 5 备份和恢复5.1 备份恢复概述5.1.1 为什么要备份5.1.2 备份类型5.1.3 备份什么5.1.4 备份注意要点5.1.5 还原要点5.1.6 备份工具5.1.6 基于 LVM 的快照备份5.1.7 实战案例:数据库冷备份和还原 5.2 mysqldump备份工具5.2.…

【脚本分享】- Windows下利用Powershell进行MySQL数据库备份

关注「WeiyiGeek」公众号 将我设为「特别关注」,每天带你玩转网络安全运维、应用开发、物联网IOT学习! 测试环境: Server 2008 R2 所需软件: - MySQLdump.exe - msvcp120.dll x64/x86- msvcr120.dll x64/x86- powershell- 7z 设置PowerShell策略: PS…

数据库备份脚本大全

备份脚本六个注意点 在写脚本前我这里按照个人习惯大概总结了以下六点,感兴趣的可以继续看看,不感兴趣的直接跳过就好。 1、首先要注意的一点就是 shell 环境是 bash 还是 sh ,需要在你的脚本开头中注明。 #!/bin/bash 2、其次就是数据库环境变量需要申明…

C#实现MySQL数据库数据的备份与恢复

这几天一直在做学校的C#期末项目,其中有一个功能就是数据的备份与恢复,在百度了一番之后,只找到了适用于SQL Server的备份SQL语句 BACKUP DATABASE database_name TO DISK physical_device_name [ WITH { DIFFERENTIAL | COPY_ONLY | {…

Linux Mysql自动备份

1.配置自动备份环境 1.1 创建文件见放脚本文件和备份数据 # 创建/data/backup/mysqlmkdir -p /data/backup/mysqlcd /data/backup# 创建mysql_backup.sh的脚本并且填充数据vi mysql_backup.sh# vi mysql_backup.sh进行编辑和修改 1.2 创建 备份数据的语句 mysql_backup.sh…

wamp 备份 mysql数据库_wamp:MySql数据库备份还原(mysqldump)

mysql数据库备份和恢复命令在mysql安装目录中的bin目录下,例如wamp安装在e:\wamp目录下,备份目录就在e:\wamp\mysql\mysql5.0.51b\bin目录中,备份和恢复操作在DOS命令符状态下完成: 1、备份数据库: mysqldump -u 用户名…

MySQL 20 MySQL 数据库备份

8.2 数据库备份 不用我多说,都知道 为什么需要数据库备份。因为 你在增删改查的时候,肯定会 出现 误操。(导致一些数据修改错误,或者一些数据被不小心干掉!) 保证重要的数据不丢失为了让我们 对数据操作的…

MySQL数据库的定时备份实践

1.背景介绍 也许你会发现本站建站时间久远,但是本站的各类访问量总是很低,这大概是有两个方面的原因,其一是因为本站升级2.0后,所有的文章访问数据并未同步(不仅仅是文章,所有的数据均为同步,比…

Python NumPy计算欧氏距离(Euclidean Distance)

欧氏距离定义: 欧氏距离( Euclidean distance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。 在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是: begin{equation} d sq…

Euclidean division

In arithmetic, Euclidean division – or division with remainder – is the process of dividing one integer (the dividend) by another (the divisor), in a way that produces an integer quotient and a natural number remainder strictly smaller than the absolute …

PRN(20201012):Improved updating of Euclidean distance maps and Voronoi diagrams

[*] Lau B , Sprunk C , Burgard W . Improved updating of Euclidean distance maps and Voronoi diagrams[C]// IEEE/RSJ International Conference on Intelligent Robots & Systems. IEEE, 2010. 本文对[*]中的Occupancy Map to Euclidean Distance Maps算法进行python…

java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...

最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算,而且有很多论文提出了Attention机制,所以这里就介绍一下如何使用tensorflow实现上述各种功能。 这里首先假定我们的输入是两个四维的Tensor,然后我们需要计算的是其…

点云检测--欧式聚类Euclidean Cluster

1.版本要求 版本: >PCL1.3 2.简介 欧式聚类是点云聚类的一种重要方法,利用点云中点与点之间的欧式距离进行聚类,当点与点之间的欧式距离小于设定的阈值则视为一类。欧式聚类是车辆前方障碍物检测的重要方法。 3.数据 本例中使用的点云数据&#…

Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MAV Planning

作者: 19届 lz 日期:2022-3-2 论文:《Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MA V Planning》 整个系统功能分为两部分: 将传入的传感器数据合并到 TSDF 中(第 IV 节)&…

3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation

文章目录 聚类结果一、论文内容1.1 Ground Surface Removal1.2 Fast Euclidean Clustering题外:欧几里得聚类Fast Euclidean ClusteringFEC利用具有点索引顺序的逐点方案的浅显理解 1.3 源码中问题说明 二、参考 聚类结果 原始代码中采用的是pcl中的搜索方式&#…