7

是否有一个实现独立TCP堆栈的Python库?Python TCP堆栈实现

,因为我通过套接字(他们正在隧道边向我这个插座)接收的数据包流,我不能使用普通的Python socket库。当我收到一个指向特定端口的TCP SYN数据包时,我想接受连接(发送syn-ack),然后获取由另一端发送的数据(正确确认)。

我当时希望有某种已经写好的TCP堆栈可以使用。有任何想法吗?我过去曾经使用lwip做过一个C项目 - 在python中的这些行将会是完美的。

+2

我最终在Python中实现了一个非常基本的TCP栈。这正是我所从事的项目所需要的,但可以使用一些工作。如果你想看看它的来源,请访问:http://github.com/dound/vns/blob/master/TCPStack.py – 2010-02-07 21:08:13

回答

7

你不说你正在使用哪个平台,但是如果你在使用linux,我会打开一个tun/tap interface并将IP数据包作为一个真正的网络接口返回到内核中,这样内核可以完成所有工作那些棘手的TCP东西。

这是(例如)OpenVPN的工作原理 - 它通过UDP或TCP接收原始IP数据包,并通过tun/tap接口将它们隧道传回内核。

我认为有一个TUN/TAP接口窗口现在也将其用于OpenVPN的端口到Windows开发。

+0

我喜欢这个想法。我使用的是linux,因此获取tun/tap设备和tap0 intf设置并不困难。不幸的是,我不知道如何使用它。首先,我正在将我的原始未封装数据包写入tap0(使用原始套接字)。我看到tap0上显示正确的SYN数据包(指向tap0的MAC和IP地址)。但是,如果我运行netcat侦听tap0的IP地址,我不会看到它用syn-ack进行响应。我可以通过telnet连接到它(尽管内核似乎只是通过lo来缩短这个流量)。 任何关于如何让这个工作的指针?谢谢尼克! – 2009-10-18 20:46:49

1

我知道这是不是直接的Python相关的,但如果你正在寻找做繁重的网络处理,你应该考虑二郎神,而不是Python的。只是一个建议......你总是可以用Twisted做一个这样的事情......如果你觉得喜欢冒险(并且有很多时间在你身边);-)

+0

为什么选择Erlang?为什么不是C? C++? Java的? etc ... – jmucchiello 2009-10-17 01:22:07

+1

因为Erlang非常适合做异步进程。 – jldupont 2009-10-17 01:34:46

+1

我投票赞成这项决定 - 投弃权票的人应该为自己感到羞愧 - 要求某人质疑他们的工具要求没有任何不妥。这就是说 - 为什么erlang具体? – 2009-10-17 01:35:14

0

你也许可以使用ctypes模块导入lwip并再次使用它。

+0

不是一个坏主意,但我认为这需要比我在这一个上寻找更多的工作。 – 2009-10-18 20:48:03

2

扫视Scapy,它看起来像它可能能够处理这些低级别的情况。我没有自己使用它,所以我不能确认它是否解释了你所做的。我只浏览了文档。

+0

Scapy很整洁,但我认为它不会帮助我处理协议本身 - 只是将数据包解码为其组成字段? – 2009-10-18 20:49:13

0

如果您已经在插座的另一端,即转发TCP包你致力于软件,那么也许TCPWatch会告诉你如何得到的SYN数据包。 SCAPY确实非常适合发送您想要的数据包,但我不确定它会作为代理服务器。

http://hathawaymix.org/Software/TCPWatch

但是,如果你不承诺什么是在发送端,则可以考虑使用双绞线或海螺的paramiko做SSH转发。即使你不需要加密,你仍然可以使用这些对你的CPU影响很小的河豚。这并不意味着你需要另一端的Conch,因为SSH是标准化的,所以任何SSH软件都应该工作。在SSH世界中,这通常被称为“端口转发”,人们​​使用SSH终端客户端登录SSH服务器并设置端口转发隧道。海螺和Paramiko允许您将其构建到Python应用程序中,以便不需要SSH终端客户端。