Python3 实现局域网 IP 的 ARP 查询

在进行网络编程时,ARP(地址解析协议)是一个重要的协议,它帮助我们将 IP 地址映射到 MAC 地址。本文将教你如何使用 Python3 实现局域网中的 IP 的 ARP 查询。在这篇文章中,首先我们将展示整体的流程,接着逐步讲解每一个步骤的代码实现及其意义。

步骤流程

我们将整个实现过程分为以下步骤:

步骤编号 步骤描述
1 导入必要的库
2 定义一个 ARP 查询类
3 创建 ARP 查询的功能
4 获取局域网 IP 地址范围
5 发起 ARP 请求并处理返回
6 输出查询结果

步骤详解与代码示例

步骤 1: 导入必要的库

在这个步骤中,需要导入一些模块以便于后续的操作。我们需要使用 scapy 模块来执行 ARP 查询。

from scapy.all import ARP, Ether, srp, conf
  • ARP: 用于创建 ARP 数据包。
  • Ether: 用于创建以太网数据包。
  • srp: 用于发送并接收数据包。
  • conf: 配置选项,后续我们将用它来设置一些网络参数。

步骤 2: 定义一个 ARP 查询类

为了让代码结构更清晰,我们可以把 ARP 查询功能封装成一个类。

class ARPScanner:
    def __init__(self, ip_range):
        self.ip_range = ip_range  # 存储 IP 地址范围
  • __init__: 类的构造函数,接受一个 IP 地址范围作为参数,并将其存储为实例变量。

步骤 3: 创建 ARP 查询的功能

在这个步骤中,我们定义一个方法用于发起 ARP 请求。

    def scan(self):
        # 创建 ARP 请求
        arp_request = ARP(pdst=self.ip_range)
        # 创建以太网帧
        ether_frame = Ether(dst="ff:ff:ff:ff:ff:ff")
        # 发送请求并接收响应
        arp_response = srp(ether_frame/arp_request, timeout=2, verbose=False)[0]
        
        # 处理请求并返回结果
        results = []
        for sent, received in arp_response:
            results.append({'ip': received.psrc, 'mac': received.hwsrc})
        return results
  • ARP(pdst=self.ip_range): 创建一个 ARP 请求对象,指定目标 IP 范围。
  • Ether(dst="ff:ff:ff:ff:ff:ff"): 创建一个以太网帧,以广播方式发送(目标为 FF:FF:FF:FF:FF:FF)。
  • srp: 发送请求并等待响应,设置超时为 2 秒。
  • results: 用于存储响应的 IP 和 MAC 地址。

步骤 4: 获取局域网 IP 地址范围

为了进行 ARP 查询,我们需要指定一个局域网的 IP 地址范围。这里假设你的局域网 IP 地址范围是 192.168.1.1/24

if __name__ == "__main__":
    ip_range = "192.168.1.1/24"  # 根据实际情况设置你的 IP 范围
    scanner = ARPScanner(ip_range)
    results = scanner.scan()
  • ip_range: 你局域网的 IP 范围。

步骤 5: 发起 ARP 请求并处理返回

调用 scan 方法,并将返回的结果存储到一个变量中。

    for result in results:
        print(f"IP: {result['ip']} - MAC: {result['mac']}")
  • 输出每个响应的 IP 和 MAC 地址。

步骤 6: 输出查询结果

最后,我们将结果打印出来,以便查看 ARP 查询结果。

类图展示

通过 Mermaid 语法,我们可以用类图来展示 ARPScanner 类的结构。

classDiagram
    class ARPScanner {
        +ip_range: str
        +scan(): List[Dict[str, str]]
    }

结果展示

运行这段代码后,你将会得到类似以下的输出(具体 IP 和 MAC 地址会因网络环境而异):

IP: 192.168.1.10 - MAC: 00:0c:29:68:e9:35
IP: 192.168.1.11 - MAC: 00:0c:29:68:e1:eb
...

总结

本文详细介绍了如何使用 Python3 实现局域网 IP 的 ARP 查询。我们从代码结构、步骤流程到实际运行效果进行了全方位的讲解。通过使用 Scapy 库,你可以快速实现 ARP 查询功能。

数据可视化

最后,你可以用下面的代码块进行简单的饼状图展示,帮助你更直观地理解各设备的分布情况。

pie
    title 设备分布情况
    "设备A": 40
    "设备B": 30
    "设备C": 20
    "其他设备": 10

结束语

随着网络编程的深入,ARP 查询是一个重要的基础知识,掌握它将为你今后的网络编程打下坚实的基础。希望这篇文章能对你有所帮助,祝你在学习 Python 和网络编程的道路上越走越远!