【问题标题】:How to use tun/tap interface to split packets, tunnel and then reassemble. (similar to MLPPP)如何使用 tun/tap 接口拆分数据包、隧道然后重新组装。 (类似于 MLPPP)
【发布时间】:2011-08-26 11:12:31
【问题描述】:

我正在寻找创建一个客户端/服务器应用程序,我可以使用它来将网络数据包分成两半,通过单独的 udp 连接隧道传输数据包的每一半(因为每个 udp 连接将通过不同的 wifi 链接)和然后在另一端重新组装拆分的数据包。除了拆分数据包外,每半个数据包还必须有一个 ID 和序列号,以便它们可以正确重组。

基本上我正在尝试做类似于MLPPP 的事情

我希望使用 python 和 TUN/TAP 网络驱动程序来执行此操作。 我发现了以下我认为可能对这个项目有帮助的 Python 代码示例和模块。

Python tun/tap

Python 原始数据包操作

我的问题是可以使用 python 完成必要的数据包修改吗?有什么可能的方法来解决这个问题?我可以使用上面的模块来做到这一点还是有更好的解决方案?由于我不是经验丰富的程序员,我正在寻找一些可以引导我朝着正确方向前进的输入。欢迎提供任何代码示例或其他链接。

【问题讨论】:

  • 我没有给你的答案——但我会说,如果你要更改用户空间中的每个数据包,我认为你会对性能感到非常失望。在吞吐量和延迟方面。我用 scapy 做了类似的事情(在处理 python 用户空间中的每个数据包时类似),性能很糟糕。 FWIW
  • 使用不同的编程语言会有所不同,还是只有使用自定义内核模块才能获得可接受的性能?
  • 我知道的还不够多——但我已经阅读了其他一些关于从内核到用户空间的上下文切换成本的研究,我只能想象你是否必须为每一包,你都会感受到。这并不是说你不能让它足够快地满足你的需求,只是要有现实的期望。

标签: python networking packet tap


【解决方案1】:

我们正在生产中做这样的事情,而且效果很好。不过,我们不会拆分单个数据包。我们为每个连接设置分数权重(无限制)并将数据包发送出去。我们有一些代码来处理每一行的不同延迟。在另一端,我们缓冲它们并重新排序。性能非常好 - 我们的网站有 5 条以上的 ADSL 线路,而且速度不错,下载速度超过 40 Mbps。

拆分数据包(例如 1500/2 = 750)会引入不必要的开销...保持数据包尽可能大。

我们为 UDP 数据包开发了自己的协议(标头格式)。我们已经在高达 200 Mbps 的 tun/tap 上进行了环回测试,因此内核与用户空间的交互肯定运行良好。以前我们使用 NFQUEUE,但存在可靠性问题。

以上所有内容都是用 Python 编写的。

【讨论】:

  • 你也是用 Python 做的吗?
  • 是的,我们都是用 Python 编写的
  • 一年多过去了,我仍然没有对此做任何事情:-(。我假设由于您没有进行数据包拆分,最终绑定链路的 MTU 大小低于标准1500 大小。这对某些应用程序来说是个问题吗?
  • 抱歉延迟回复...我们丢失了大约 24 个字节,因此我们的 MTU 略小一些。由于我们进行了 TCP MSS 钳制,所有应用程序都运行良好。不同的 MTU 大小在 Internet 上很常见。试想一下,PPPoE 通常是 1492,许多其他 VPN 系统也有开销。
【解决方案2】:

在我看来完全有可能。

您发现的 tun/tap 模块看起来可以胜任这项工作。 Twisted 将是高性能和全力以赴的伤害您的头部的成本。

至于拆分数据包,您不需要以任何方式解释数据,只需将其视为二进制数据块,将其拆分为两部分并添加标头 - 我不会使用任何 3rd 方模块为此,只是正常的 python 字符串处理。

如果您想要一种易于使用的数据包封装格式,也可以使用netstrings

我不认为它会像火箭一样飞,但我相信你会学到很多东西!

【讨论】:

  • 我并不是真的希望它像火箭一样飞。我想我应该在问题中添加我的性能要求。理想情况下,我希望这个应用程序能够以至少 2Mbps 的速度传输数据。如果这对于 python 或任何其他用户空间实现不现实,那么我可能应该走另一条路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2020-07-20
  • 1970-01-01
相关资源
最近更新 更多