Whosthere 核心原理揭秘:mDNS、SSDP 与 ARP 三大发现机制如何协同工作
Whosthere 核心原理揭秘mDNS、SSDP 与 ARP 三大发现机制如何协同工作【免费下载链接】whosthereLocal Area Network discovery tool with an interactive Terminal User Interface (TUI) written in Go. Discover, explore, and understand your LAN in an intuitive way. Knock Knock.. whos there? 项目地址: https://gitcode.com/gh_mirrors/wh/whosthereWhosthere 是一款用 Go 编写的开源局域网发现工具通过 mDNS、SSDP 和 ARP 缓存三种无特权扫描机制并发探测网段内的所有设备并自动通过 OUI 查询显示设备厂商。本文将带你深入了解它的三大发现机制是如何协同工作的。总体架构一个指挥官协调三路侦察兵Whosthere 的核心是发现引擎 Engine它像一个指挥官同时调度多个扫描器Scanner和一个 ARP 填充器Sweeper。每个扫描器独立并发运行把发现的设备发送到同一个通道引擎再按IP 地址去重合并。默认节奏如下定义在 engine.go机制默认行为扫描周期每 20 秒一轮每轮最长 10 秒子网清扫每 5 分钟触发一次最长 20 秒扫描器mDNS SSDP ARP 缓存全部默认启用引擎的并发调度逻辑见 performScan每个扫描器一个 goroutine结果汇入共享通道互不阻塞。mDNS让愿意自我介绍的设备现身mDNS多播 DNS扫描器位于 pkg/discovery/scanners/mdns/基于 hashicorp/mdns 库实现。它的工作原理很简单向网段发送一条_services._dns-sd._udp的多播查询任何支持 mDNS 的服务AirPlay、Chromecast、打印服务、NAS 等都会主动应答。能拿到什么✅ 设备 IP 和设备名称如My-MacBook.local✅ 设备提供的所有服务列表会作为附加数据展示❌ 拿不到 MAC 地址擅长发现苹果生态设备、投屏设备、NAS、带投屏功能的路由器。查询结果会被过滤只保留属于当前接口网段的 IPv4 地址见 acceptsIPv4。SSDP智能家电的点名广播SSDP简单服务发现协议是 UPnP 标准的一部分扫描器位于 pkg/discovery/scanners/ssdp/。它的流程分两步见 sendSearch广播点名向固定多播地址239.255.255.250:1900发送一条M-SEARCH * HTTP/1.1请求相当于喊一声网段里所有 UPnP 设备请举手收集应答设备返回的响应里带有LOCATION设备描述 XML 地址和SERVER头扫描器解析出 IP 和服务信息能拿到什么✅ 设备 IP 和服务器标识如Linux UPnP/1.0❌ 同样没有 MAC 地址擅长发现智能电视、机顶盒、网络打印机、智能音箱、家庭自动化设备——这些设备大多只实现了 UPnP 而没有 mDNS。 正因为 mDNS 和 SSDP 覆盖面不同Whosthere 才两者都要一个抓苹果系和网络服务一个抓智能家电系。ARP 缓存不发消息只查考勤第三个扫描器思路完全不同它不发送任何数据包而是直接读取操作系统的 ARP 缓存表pkg/discovery/scanners/arp/。ARP地址解析协议是局域网通信的基础设备之间通过 IP 通信但二层实际认的是 MAC 地址。每次本机要和某 IP 通信OS 都会自动执行 ARP 解析并把IP ↔ MAC映射存入缓存。ARP 扫描器每 250 毫秒轮询一次系统缓存Scan跨 Linux/macOS/Windows 读取各自的 ARP 表顺便过滤掉多播、广播等无效条目。能拿到什么✅ 设备 IP MAC 地址这是其他两个扫描器都给不了的❌ 拿不到设备名称短板也很明显缓存是被动积累的——设备最近没和你在网上说句话缓存里就没有它。所以才需要下一位主角登场。Sweeper无特权下的敲门秘诀 既然发送原始 ARP 请求需要 root 权限Whosthere 坚持无特权运行它如何解决缓存稀疏的问题答案是 Sweeper——项目签名语Knock Knock.. whos there?的由来。它的巧妙之处在于借力打力生成目标子网内所有 IP 的列表跳过本机并发 200 路向每个 IP 的常见端口敲门UDP 端口9、33434各发送一个字节TCP 端口80、443尝试连接300ms 超时连接成不成功无所谓——只要目标是活设备OS 为了发包就会自动执行 ARP 解析把IP ↔ MAC写进缓存随后 ARP 扫描器查考勤时这些新条目就被读出来了。触发逻辑在 sendARPTarget每 5 分钟轮一次可配置。这种以应用层流量触发协议层行为的设计是完全不需要提权就能填充 ARP 缓存的关键。三源合一设备合并与 OUI 厂商识别三路侦察兵汇报回来后引擎在 processDevice 中按 IP 做合并同一 IP 的多条记录调用 Device.Merge 互补字段mDNS 提供名称SSDP 提供服务信息ARP 提供 MAC每个设备会记录自己是被哪些源发现的sources在 TUI 中可以看到若设备有 MAC 但缺厂商信息引擎会用内置的 OUI 数据库 查询 MAC 前缀自动填上制造商标识如小米Apple最终你在 TUI 里看到的每一行设备都是三个机制叠加补全后的完整画像192.168.1.50 | AA:BB:CC:11:22:33 | 小米 | My-Phone.local | sources: mdns arp-cache协同效果一览mDNSSSDPARP 缓存工作方式主动多播查询主动多播点名被动读取系统缓存得到 IP✅✅✅得到 MAC❌❌✅得到名称/服务✅✅❌需要 Sweeper 配合否否是典型目标AirPlay/Chromecast/NAS电视/音箱/打印机几乎所有设备一句话总结mDNS 和 SSDP 负责点名要名字Sweeper 负责挨家敲门ARP 缓存负责登记花名册——三者并发互补让 Whosthere 无需 root 就能画出一幅尽可能完整的局域网设备地图。延伸阅读引擎与扫描调度pkg/discovery/engine.go扫描器统一接口定义Scanner/Sweeperpkg/discovery/engine.go子网解析工具pkg/discovery/internal/subnet/subnet.go端口扫描器发现设备后进一步探测服务pkg/discovery/port_scanner.go配置各扫描器开关internal/core/config/config.go【免费下载链接】whosthereLocal Area Network discovery tool with an interactive Terminal User Interface (TUI) written in Go. Discover, explore, and understand your LAN in an intuitive way. Knock Knock.. whos there? 项目地址: https://gitcode.com/gh_mirrors/wh/whosthere创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考