如何使用tun/tap接口分割数据包、隧道并重新组装(类似MLPPP)

7 投票
2 回答
5747 浏览
提问于 2025-04-16 17:44

我想创建一个客户端/服务器应用程序,用来把网络数据包一分为二,然后通过两个不同的UDP连接分别发送这两个部分(因为每个UDP连接会走不同的WiFi链接),最后在另一端把分开的数据包重新组合起来。除了分割数据包,每个半个数据包还需要有一个ID和序列号,以便能正确地重新组合。

简单来说,我想做的事情有点像MLPPP

我打算使用Python和TUN/TAP网络驱动来实现这个功能。我找到了一些Python代码示例和模块,觉得可能对这个项目有帮助。

Python tun/tap

Python原始数据包处理

我的问题是,是否可以用Python进行必要的数据包修改?我该如何着手?我能否使用上面提到的模块,还是有更好的解决方案?我希望能得到一些建议,帮助我朝正确的方向前进,因为我不是一个有经验的程序员。任何代码示例或额外链接都非常欢迎。

2 个回答

1

在我看来,这完全是可行的。

你发现的tun/tap模块看起来可以完成这个任务。Twisted会有很高的性能,不过在搞清楚这些东西的时候可能会让你有点头疼。

至于如何拆分数据包,你不需要对数据进行任何解释,只需把它当作一堆二进制数据,分成两部分,然后加上一个头部 - 我建议不要使用任何第三方模块,直接用普通的Python字符串处理就可以了。

如果你想要一个简单易用的数据包封装格式,可以使用netstrings

我不认为它会飞得很快,但我相信你在这个过程中会学到很多东西!

4

我们在实际生产中做了类似的事情,效果相当不错。不过,我们并没有拆分单个数据包。我们为每个连接设置了分数权重(没有限制),然后发送数据包。我们有一些代码来处理每条线路的不同延迟。在另一端,我们会对数据包进行缓冲和重新排序。性能表现很好,我们有一些网站使用了5条以上的ADSL线路,下载速度可以达到40Mbps以上。

拆分数据包(比如1500/2 = 750)会带来不必要的额外负担……尽量保持数据包尽可能大。

我们为UDP数据包开发了自己的协议(头部格式)。我们在tun/tap上进行了回环测试,速度可以达到200 Mbps,所以内核和用户空间之间的交互效果很好。之前我们使用过NFQUEUE,但那有可靠性问题。

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

撰写回答