ARP扫描比ping更可靠,因设备禁ping仍必响应ARP请求;scapy需用srp()发广播包(如pdst="192.168.1.1-254"),配inter=0.1和timeout=1防限速丢包。

用 scapy 发送 ARP 请求是最快、最准的方式——比 ping 少漏 30% 以上设备,尤其对手机、IoT 设备、Windows 主机(禁 ping 但必须响应 ARP)效果显著。
为什么 ARP 扫描比 ping 更可靠
很多设备默认丢弃 ICMP 包(即禁 ping),但只要接入局域网、IP 层可达,就必须响应 ARP 请求来完成二层通信。这不是“可选功能”,是 TCP/IP 协议栈强制行为。
常见错误现象:ping 192.168.1.105 超时,但该设备实际在线、能访问网页、能连 Wi-Fi;arp -a 命令里却查不到它的条目——说明它还没被本机通信触发过 ARP 学习,需主动发请求“唤醒”缓存。
-
srp()是唯一正确入口:它在数据链路层(L2)发送并接收响应;sr()不带 Ethernet 头,send()不收包,都会失败 - 必须用广播 MAC
"ff:ff:ff:ff:ff:ff",否则交换机不泛洪 - Windows 下不以管理员身份运行会报
socket.error: [Errno 10013]
如何构造一个稳定可用的 ARP 扫描片段
关键不是“能不能跑通”,而是“扫得全、不丢包、不被限速”。实操中真正卡住人的,往往是网络设备行为,而非代码逻辑。
- 别直接扫
"192.168.1.0/24":它包含网络地址(.0)和广播地址(.255),某些交换机会静默丢弃发给它们的 ARP;改用"192.168.1.1-254" - 加
inter=0.1控制包间隔:连续发包易触发交换机端口限速(如 Cisco 的storm-control),导致后半段大量超时 - 设
timeout=1:ARP 响应通常在 10–50ms 内,等 3 秒纯属浪费 - Linux/macOS 需
sudo;Windows 必须右键“以管理员身份运行”终端或 IDE
最小可用示例:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
from scapy.all import ARP, Ether, srp
arp = ARP(pdst="192.168.1.1-254")
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether/arp
result = srp(packet, timeout=1, inter=0.1, verbose=False)[0]
for sent, received in result:
print(received.psrc, received.hwsrc)
当 scapy 不可用时,用 subprocess 调 ping 作为 fallback
不是所有环境都能装 scapy(比如受限终端、容器、老旧系统),这时用系统 ping 是唯一退路,但要注意平台差异和误判。
- Windows 用
["ping", "-n", "1", "-w", "500", ip];Linux/macOS 用["ping", "-c", "1", "-W", "1", ip] - 别只看
returncode == 0:某些 Linux 发行版丢包也返回 0;应检查 stdout 是否含"bytes from"(Linux)或"TTL="(Windows) - 并发数建议 ≤ 20:
ThreadPoolExecutor(max_workers=20)是多数网卡+交换机的友好上限,再高容易触发进程创建失败或 ICMP 限速
最容易被忽略的前置动作:确认本机网段
写死 "192.168.1.0/24" 是新手最大陷阱。同一台机器换 Wi-Fi 或插网线,子网可能变成 10.0.0.0/24 或 172.16.0.0/16,扫错网段等于白忙。
实操建议:运行 ipconfig(Windows)或 ifconfig(macOS/Linux),找当前活跃网卡的 IPv4 地址和子网掩码,手动算出网段;或用 netifaces 库自动推导(需额外安装)。
复杂点在于:多网卡(Wi-Fi + 有线)、虚拟网卡(Docker/VirtualBox)、IPv6 默认启用等情况会让接口列表变长,仅靠名字匹配(如 "eth0")不可靠——必须结合 isup 状态和 IPv4 地址存在性双重判断。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










