
Whosthere Sweeper 深度解析如何用 TCP/UDP 探测无感填充 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 编写的局域网发现工具其核心的 Sweeper 模块通过向子网内所有 IP 发送 TCP/UDP 探测包无感地填充系统 ARP 缓存从而无需 root 权限就能快速发现内网设备。本文将拆解它的触发端口、并发控制与大子网保护机制帮你理解这个巧妙的设计。为什么需要无感填充 ARP 缓存ARP 缓存是操作系统记录IP → MAC 地址对应关系的表。Whosthere 的 ARP 扫描器arp.go直接读取这张表轻量且完全无侵入——但它有个前提缓存里得有数据。问题来了直接发送 ARP 请求需要原始套接字raw socket必须 root 权限 ❌而 Whosthere 的设计目标恰恰是纯用户态运行、无需提权✅Sweeper 的解法写在 sweeper.go 的注释里向子网内每个 IP 发送普通 UDP/TCP 包操作系统在发包前必须自己完成一次 ARP 解析来确定目标 MAC 地址——ARP 填充成了网络通信的副作用。┌──────────┐ UDP/TCP 包 ┌──────────┐ OS 自动发起 ┌──────────┐ │ Sweeper │ ────────────►│ 目标 IP │ ◄────────────── │ ARP 解析 │ └──────────┘ └──────────┘ (内核完成) └──────────┘ │ │ │ ▼ │ 写入 ARP 缓存 ▼ │ 连接失败无所谓 ◄─────────────────────────────◄─────────────┘ 关键细节这些连接预期都会失败Whosthere 只关心 ARP 解析被触发不关心是否建立连接见 sweeper.go 的注释。触发端口选择UDP 9/33434 与 TCP 80/443Sweeper 对每个 IP 依次尝试 4 个端口sweeper.go协议端口选择理由UDP9标准的 Discard 端口几乎所有设备都会收到并丢弃UDP33434高位随机端口大概率无人监听UDP 发包即触发 ARPTCP80常见服务端口即使拒绝也完成了 ARP 解析TCP443同上且部分设备/网关仅对 443 有响应具体发包逻辑在sendARPTarget函数sweeper.goUDP 探测写一个 1 字节的包后立即关闭不等待任何响应TCP 探测DialTimeout超时仅 300ms连上立刻关闭为什么 UDP 和 TCP 双管齐下因为部分设备如某些防火墙后的主机对入站 TCP SYN 不做 ARP 响应而对已到达的 UDP 数据报会先解析链路层地址。两条路径互补最大化 ARP 命中率。并发与超时控制200 并发 300ms 超时家用网段常见/24254 个 IP串行逐个触发会非常慢。Sweeper 用信号量控制并发sweeper.gomaxConcurrentTriggers 200最多 200 个 IP 同时触发避免拥塞网卡和内核 ARP 队列triggerDeadline 300msUDP 写入的整体截止时间tcpDialTimeout 300msTCP 拨号超时这样一轮/24扫描通常在秒级完成对网络几乎无感知。大子网保护/16 截断策略如果你的接口落在一个超大子网如/8上千万个 IP盲目全扫会瘫痪网络。generateSubnetIPs默认将扫描范围截断为 /16 等效的 65534 个 IPsweeper.go默认行为大子网只扫前 65534 个 IP并输出警告日志需要全量扫描时在配置中设置scan_large_subnets: true即可解除限制对应 config.go 的ScanLargeSubnets字段默认配置与调优参数Sweeper 在 Whosthere 中默认开启配置项定义在 config.gosweeper: enabled: true # 默认开启 interval: 5m # 两轮扫描间隔默认 5 分钟 timeout: 20s # 单轮扫描超时默认 20 秒运行节奏由 engine.go 中的常量决定参数默认值含义扫描间隔interval5 分钟ARP 缓存会老化定期重新触发保持缓存新鲜单轮超时timeout20 秒超时后取消本轮进入下一轮引擎在Scan时会并行启动 Sweeper 与各类扫描器engine.go一边发包填充缓存一边读缓存互不阻塞。与 ARP 扫描器的接力配合整个发现流程是一条流水线Sweeper 触发并发 TCP/UDP 探测 → 内核填充 ARP 缓存ARP Scanner 轮询每 250ms 读取一次系统 ARP 表arp.go跨 Linux / macOS / Windows 平台数据合并引擎按 IP 合并来自 ARP、mDNS、SSDP 的数据并用 OUI 库补全厂商信息device.go组件之间的组装逻辑见 engine_builder.go——只有sweeper.enabled: true时才会创建 Sweeper 并注入引擎。快速上手命令行开关日常使用无需关心细节直接运行即可Sweeper 默认参与扫描# 交互式 TUI whosthere # 单次 CLI 扫描5 秒 whosthere scan -t 5 # 显式关闭 Sweeper只靠 mDNS/SSDP 发现 whosthere scan --sweeperfalseJSON 输出示例whosthere scan -t 5 --json --pretty devices.json总结Whosthere 的 Sweeper 用三个技巧解决了无提权扫描内网这个经典难题副作用思维不发 ARP而是用必然失败的 TCP/UDP 发包让操作系统代劳⚡精准端口组合UDP 9/33434 TCP 80/443双协议互补提升命中率️安全兜底200 并发限流、300ms 超时、/16 子网截断保证普通用户无感对于想理解无提权局域网扫描的开发者pkg/discovery/sweeper/ 目录下的 sweeper.go 和 sweeper_options.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),仅供参考