【问题标题】:Python TCP stack implementationPython TCP栈实现
【发布时间】:2010-12-07 13:19:12
【问题描述】:

是否有实现独立 TCP 堆栈的 python 库?

我不能使用通常的 python 套接字库,因为我正在通过套接字接收数据包流(它们通过这个套接字通过隧道传送给我)。当我收到发往特定端口的 TCP SYN 数据包时,我想接受连接(发送 syn-ack),然后获取另一端发送的数据(适当地确认)。

我希望已经编写了某种我可以使用的 TCP 堆栈。有任何想法吗?过去我在 C 项目中使用过 lwip——在 python 中类似的东西会很完美。

【问题讨论】:

  • 我最终在 Python 中实现了一个非常基本的 TCP 堆栈。这正是我正在从事的项目所需要的,但可以使用一些工作。如果你还想看的话,源码在这里:github.com/dound/vns/blob/master/TCPStack.py

标签: python tcp network-programming network-protocols raw-sockets


【解决方案1】:

如果您已经致力于套接字另一端的软件,即向您转发 TCP 数据包,那么 TCPWatch 可能会告诉您如何获取 SYN 数据包。 SCAPY 确实非常适合发送您想要的数据包,但我不确定它是否可以用作代理。

http://hathawaymix.org/Software/TCPWatch

但是,如果您不致力于发送端的内容,请考虑使用 Twisted Conch 或 Paramiko 进行 SSH 转发。即使您不需要加密,您仍然可以将这些与河豚一起使用,这对您的 CPU 影响很小。这并不意味着您需要在另一端使用 Conch,因为 SSH 是标准化的,因此任何 SSH 软件都应该可以工作。在 SSH 世界中,这通常称为“端口转发”,人们​​使用 SSH 终端客户端登录 SSH 服务器并设置端口转发隧道。 Conch 和 Paramiko 允许您将其构建到 Python 应用程序中,这样就不需要 SSH 终端客户端。

【讨论】:

    【解决方案2】:

    你没有说你在哪个平台上工作,但如果你在 linux 上工作,我会打开一个tun/tap interface 并将 IP 数据包作为一个真实的网络接口返回内核,这样内核就可以做所有那些棘手的 TCP 东西。

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

    我认为现在也有一个适用于 windows 的 tun/tap 接口,它是为 windows 的 OpenVPN 端口开发的。

    【讨论】:

    • 我喜欢这个主意。我使用的是 linux,所以获取 tun/tap 设备和 tap0 intf 设置并不难。不幸的是,我不知道如何使用它。首先,我将原始未封装数据包写入 tap0(带有原始套接字)。我看到在 tap0 上显示了正确格式的 SYN 数据包(寻址到 tap0 的 MAC 和 IP 地址)。但是,如果我在 tap0 的 IP 地址上运行 netcat 侦听,我看不到它以 syn-ack 响应。我可以通过 telnet 连接到它(尽管内核似乎只是通过 lo 来缩短此流量)。关于如何让它工作的任何指示?谢谢尼克!
    【解决方案3】:

    浏览Scapy,它看起来可能能够处理这些低级情况。我自己没有使用过它,所以我无法确认它是否符合您的解释;我只浏览了文档。

    【讨论】:

    • Scapy 很简洁,但我认为它不会帮助我处理协议本身——只是将数据包解码为其组成字段?
    【解决方案4】:

    我知道这与 Python 没有直接关系,但如果您希望进行繁重的网络处理,您应该考虑使用 Erlang 而不是 Python。真的只是一个建议...如果您喜欢冒险(并且有很多时间),您可以随时尝试使用 Twisted 进行此操作 ;-)

    【讨论】:

    • 因为 Erlang 非常适合做异步进程。
    • 我投了赞成票 - 投反对票的人应该为自己感到羞耻 - 要求某人质疑他们的工具要求并没有错。话虽如此 - 为什么要专门使用 erlang?
    • 为什么选择 Erlang?因为进行数据包操作是 Erlang 存在的原因之一:它诞生于爱立信的网络产品。
    【解决方案5】:

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

    【讨论】:

    • 不错的主意,但我认为这将涉及比我正在寻找的更多的工作。
    猜你喜欢
    • 2020-01-12
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2020-04-11
    • 2015-09-22
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多