Python TCP堆栈实现

8
有没有一种Python库实现了独立的TCP协议栈?
我不能使用通常的Python套接字库,因为我正在通过套接字接收数据包流(它们通过此套接字进行隧道传输)。当我收到一个针对特定端口的TCP SYN数据包时,我想接受连接(发送syn-ack),然后获取由另一端发送的数据(适当地进行ack)。
我希望有一种已经编写好的TCP协议栈可以利用。有什么想法吗?我过去在C项目中使用过lwip - 在Python中类似的东西将是完美的。

4
最终我还是用Python实现了一个相当基本的TCP协议栈。它正好满足我在进行的项目需求,但还有一些需要改进的地方。如果你想查看它,这里是源代码连接:http://github.com/dound/vns/blob/master/TCPStack.py - David Underhill
5个回答

7
你没有说明你在哪个平台上工作,但如果你在Linux上工作,我会打开一个tun/tap接口并将IP数据包作为真正的网络接口送回内核,以便内核可以执行所有复杂的TCP操作。
这就是例如OpenVPN的工作原理 - 它通过UDP或TCP接收原始IP数据包,并通过tun/tap接口隧道将它们送回内核。
我认为现在Windows也有一个tun/tap接口,是为了将OpenVPN移植到Windows而开发的。

我喜欢这个想法。我正在使用Linux,因此获取tun/tap设备和tap0 intf设置并不困难。不幸的是,我不知道如何利用它。首先,我使用原始套接字将我的未封装数据包写入tap0。我看到正确形式的SYN数据包出现在tap0上(寻址到tap0的MAC和IP地址)。但是,如果我在tap0的IP地址上运行netcat监听,我没有看到它响应syn-ack。我能够使用telnet连接到它(虽然内核似乎只是通过lo快捷处理这个流量)。您有什么指导可以让我使其工作?谢谢Nick! - David Underhill

2

浏览一下Scapy,看起来它似乎能处理这些低级情况。我自己并没有使用过,所以不能确认它是否能够做到你所解释的内容;我只是浏览了一下文档。


Scapy很好用,但我认为它不能帮助我处理协议本身——只能将数据包解码成其组成字段? - David Underhill

0

我知道这与Python没有直接关系,但如果你想进行大量的网络处理,你应该考虑使用Erlang而不是Python。这只是一个建议... 如果你感到冒险(并且有很多时间),你可以尝试使用Twisted来完成这个任务;-)


1
因为Erlang非常适合进行异步处理。 - jldupont
1
我投了赞成票 - 投反对票的人应该感到羞耻 - 要求某人质疑他们的工具需求没有任何问题。话虽如此 - 为什么特别选择 Erlang? - Shane C. Mason
1
为什么选择Erlang?因为数据包操作是Erlang存在的原因之一:它诞生于Ericsson为其网络产品而设计。 - jldupont

0

你可以尝试使用ctypes模块来导入lwip并再次使用它。


不是一个坏主意,但我认为这将涉及比我在这方面寻找的更多的工作。 - David Underhill

0

如果你已经把软件绑定到了另一个端口,该端口将TCP数据包转发给你,那么也许TCPWatch可以帮助你获取SYN数据包。SCAPY非常适合发送所需的数据包,但我不确定它是否适用于代理。

http://hathawaymix.org/Software/TCPWatch

然而,如果您不想使用发送端的内容,那么考虑使用Twisted Conch或Paramiko进行SSH转发。即使您不需要加密,您仍然可以使用具有低CPU影响的blowfish。这并不意味着您需要在另一端使用Conch,因为SSH是标准化的,所以任何SSH软件都应该可以工作。在SSH世界中,这通常被称为“端口转发”,人们使用SSH终端客户端登录到SSH服务器并设置端口转发隧道。Conch和Paramiko允许您将此构建到Python应用程序中,因此无需使用SSH终端客户端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接