在数据链路层(获取IP地址之前)与Python通信

在数据链路层(获取IP地址之前)与Python通信,python,networking,ip,data-link-layer,Python,Networking,Ip,Data Link Layer,使用Python,是否可以在IP地址之前或之外直接在数据链路层上进行通信?与USB通信类似 我有个客户想试试这个。据我所知,没有办法。但我决不想低估Python的威力 Python没有任何内在的东西阻止您编写自己的用户级网络堆栈。但是,如果您想说,请访问原始以太网驱动程序以发送原始以太网数据包,这必须由操作系统支持 我将试图对正在发生的事情描绘一幅模糊的画面。其中一些你可能已经知道(或者不知道)。传统的操作系统提供了一种称为系统调用层的抽象,允许程序与硬件交互。这种抽象通常有点“高级”,因为它抽

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


我有个客户想试试这个。据我所知,没有办法。但我决不想低估Python的威力

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

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

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

那么,这可以在Python中访问吗


s现在应该是一个套接字,您可以使用它发送原始数据包。有关如何实现这一点的更多信息,请参阅另一篇堆栈溢出文章——它们比我做得更好。这项技术似乎也适用于Windows,因为我怀疑它们提供了类似的抽象。

回答得非常好。对于我的客户想要完成的事情,我将总结为“否”(或者,至少,没有用处):)Thx
 import socket
 s = socket(socket.AF_PACKET, socket.SOCK_RAW)
 s.bind(("eth1", 0))