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

3 投票
3 回答
2757 浏览
提问于 2025-04-16 14:17

我想用Python从TCP流套接字中读取一个完整的(原始的)IP帧。简单来说,我想要一个没有任何修改的帧,就像它直接从物理线路上来的那样,包括所有的头部信息。

我一直在研究Python中的原始套接字,但遇到了一些问题。我不需要自己构造数据包,我只需要逐字读取并转发它们。

那么,我该如何从现有的TCP套接字中读取整个IP帧(包括头部)呢?

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

谢谢!

3 个回答

0

你可以试试 scapy 这个工具。

0

也许 pylibpcap 可以做到这一点。

3

如果你不介意使用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)

你可以在不同的线程或进程中运行这个sniff,设置count=0,这样它就可以一直运行下去,把收到的数据包放到一个队列里。如果你这样做,记得把str(pkt)放到队列里。我见过把scapy的数据包放到multiprocessing.Queue里时出现奇怪的问题。

Debian和Ubuntu的apt软件库里都有Scapy。我不太清楚rpm发行版的情况。不过,从源代码安装其实也很简单:只需要运行./setup.py install

撰写回答