0

是否有可能使用 Python 在 IP 地址之前或之外直接在数据链路层上进行通信?类似于与 USB 通信?

我有一个客户有兴趣尝试这个。据我所知,没有办法。但我永远不想低估 Python 的力量。

4

1 回答 1

1

Python 没有任何内在的东西可以阻止您编写自己的用户级网络堆栈。但是,如果您想说,访问原始以太网驱动程序以发送原始以太网数据包,则必须由操作系统支持。

我会试着画一个模糊的画面来说明正在发生的事情。其中一些您可能已经知道(或不知道)。传统的操作系统提供了一种称为系统调用层的抽象,以允许程序与硬件进行交互。这种抽象通常有点“高级”,因为它抽象了硬件的一些细节。在实现 Unix 抽象的操作系统中,网络抽象系统调用之一是socket(int domain, int type, int proto),它创建一个新的套接字端点。这里有什么被抽象出来的?好吧,对于大多数协议来说,处理数据链路层的细节变得不必要了。显然,您在这里失去了一些灵活性,因此您可以获得安全性(如果您具有原始硬件访问权限,则不必担心破坏其他操作系统数据结构)和便利性(大多数人不需要实现用户级网络堆栈)。

因此,是否“可以”在不修改内核的情况下完成取决于操作系统提供的抽象。Linux 提供了 packet(7)接口,允许您将其AF_PACKET用作您的套接字域。根据手册页,“数据包套接字用于在设备驱动程序(OSI 第 2 层)级别接收或发送原始数据包。”

那么这可以在 Python 中访问吗?你打赌!

 import socket
 s = socket(socket.AF_PACKET, socket.SOCK_RAW)
 s.bind(("eth1", 0))

s 现在应该是一个套接字,您可以使用它来发送原始数据包。有关如何执行此操作的更多信息,请参阅其他 Stack Overflow 帖子——他们比我做得更好。看起来这种技术也应该适用于 Windows,因为我怀疑它们提供了类似的抽象。

于 2017-06-28T18:37:02.650 回答