首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python在数据链路层进行通信(在获取IP地址之前

使用Python在数据链路层进行通信(在获取IP地址之前
EN

Stack Overflow用户
提问于 2017-06-29 01:59:40
回答 1查看 1.1K关注 0票数 0

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-29 02:37:03

Python本身并不会阻止您编写自己的用户级网络堆栈。但是,如果你想访问原始的以太网驱动程序来发送原始的以太网数据包,这必须得到操作系统的支持。

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

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

那么可以在Python中访问它吗?You bet!

代码语言:javascript
复制
 import socket
 s = socket(socket.AF_PACKET, socket.SOCK_RAW)
 s.bind(("eth1", 0))

%s现在应该是一个套接字,您可以使用它来发送原始数据包。有关如何做到这一点的更多信息,请参阅另一篇Stack Overflow帖子--他们比我做得更好。看起来这项技术也应该在Windows上工作,因为我怀疑他们提供了类似的抽象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44809563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档