2011-05-16 206 views
5

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

基本上我试图做类似的事情,以MLPPP

我要做到这一点使用python和TUN/TAP网络驱动程序。 我发现下面的python代码示例和模块,我认为可能对这个项目有所帮助。

的Python TUN/TAP

Python原始分组操纵

我的问题是可以在必要的包修改使用Python和这将是解决这个可能的方式来完成?我可以使用上述模块来做到这一点,还是有更好的解决方案?我正在寻找一些能够引导我朝着正确方向发展的投入,因为我不是一个有经验的程序员。任何代码示例或其他链接都是受欢迎的。

+1

我没有给你答案,但我会说,如果你正在改变用户空间中的每个数据包,我认为你会对性能感到非常失望。无论是吞吐量还是延迟。我做了类似scapy的处理(类似于处理python用户空间中的每个数据包),性能非常糟糕。 FWIW – tMC 2011-05-16 13:37:01

+0

使用不同的编程语言是否会产生影响,或者只能使用像定制内核模块这样的可接受性能? – wtip 2011-05-16 13:58:52

+1

我还没有做足够的知识 - 但我已经阅读了一些关于从内核切换到用户空间的上下文开销的研究,我只能想象如果您必须为每个数据包制作切换,您会感觉到它。这并不是说你不能快速满足你的需求,只是有现实的期望。 – tMC 2011-05-16 15:03:34

回答

3

在生产中我们正在做这样的事情,它工作得很好。尽管我们不分割单个数据包。我们为每个连接设置分数权重(无限制)并发送数据包。我们有一些代码来处理每一行中不同的延迟。另一方面,我们缓冲它们并重新排序。性能非常好 - 我们的网站拥有5条以上的ADSL线路,并且在下载速度上可以达到40+ Mbps的速度。

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

我们为UDP数据包开发了自己的协议(头格式)。我们已经对tun/tap进行了高达200 Mbps的环回测试,所以内核与用户空间的交互确实很好。以前我们使用NFQUEUE,但有可靠性问题。

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

+0

你在Python中做过吗? – 2012-09-11 14:13:51

+0

是的,我们用Python编写了所有的东西 – 2012-10-16 03:46:59

+0

一年多之后,我仍然没有做任何事情:-(我假设你没有做分组分割,最终绑定链路的MTU大小低于标准的1500尺寸这对于某些应用来说是个问题 – wtip 2013-02-10 23:38:28

1

对我来说这完全可能。

你发现的tun/tap模块看起来像他们会做的工作。扭曲将是高性能和伤害你的头的全部成本。

至于拆分数据包,你不需要以任何方式解释数据,只要把它当作一个二进制数据blob,将它分成两部分并添加一个头部 - 我不会使用任何第三方模块,只是普通的Python字符串处理。

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

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

+0

我并不是真的想要像火箭一样去做这件事。我想我应该在问题中添加我的性能要求。理想情况下,我希望此应用程序能够以至少2Mbps的速度传输数据。如果这对python或其他用户空间实现来说不太实际,那么我应该走上一条不同的道路。 – wtip 2011-05-16 21:50:31

相关问题