如何从Python中的TCP套接字读取完整的IP帧?

如何从Python中的TCP套接字读取完整的IP帧?

问题描述:

我需要使用Python从TCP流套接字读取完整(原始)IP帧。本质上,我需要一个未经修改的框架,就像它脱离物理线路一样,包括所有标题信息。如何从Python中的TCP套接字读取完整的IP帧?

我一直在Python中寻找原始套接字,但我遇到了一些问题。我不需要组建我自己的数据包,我只需要逐字阅读并转发它们。

那么,如何从现有的TCP套接字(在Python中)读取整个IP帧(包括头文件)呢?

最好我只想使用标准库。另外,我在Linux主机上。

谢谢!

+6

您不能“从TCP套接字读取整个IP帧”(不管使用哪种语言)。 TCP套接字不提供对原始数据包的访问。您可能需要使用数据包嗅探接口。 – 2011-03-23 19:23:48

+0

那么,如果我创建了一个TCP服务器,是否可以创建一个连接到TCP端口的原始套接字?无论哪种方式,我认为我正在建议使用数据包嗅探界面。 – 2011-03-23 19:47:46

+0

原始套接字没有“端口”语义!在您的TCP服务器中,套接字是在网络上的图层上创建的。所有接收到的数据都已被操作系统从较低层剥离。获取它们的唯一方法是通过嗅探原始数据包并自己确定类型/端口和其他高级语义(或通过某个库)。 – Santa 2011-03-24 01:25:32

如果您不介意使用Scapy,这不是标准库的一部分,并且超速并非要求,您可以使用它的sniff函数。它需要回调。喜欢的东西:

pkts_rxd = [] 
def process_and_send(pkt): 
    pkts_rxd.append(pkt) 
    sendp(pkt, 'eth1') 
sniff(prn=process_and_send, iface='eth0', count=100) 

您可以在不同的线程或进程运行在呼吸,与count=0如果你希望它永远跑在队列粘接收的数据包。只要确保你将str(pkt)放在队列中。当我在multiprocessing.Queue上放置scapy数据包时,我看到了奇怪的事情。

Debian和Ubuntu在它们的存储库中都有Scapy。我不知道rpm发行版。从源代码安装相当容易:./setup.py install

+0

感谢您的建议和示例!现在在代码中试试这个... – 2011-03-23 19:48:21

+0

好吧,这绝对是一种方式。谢谢你的提示! – 2011-03-24 18:01:11

您应该尝试scapy

也许pylibpcap可以做到这一点。