UDP转TCP的跨平台新思路解决UDP被QoS的问题
为了解决UDP被QoS的问题,有了udp2raw、kcptun-raw等项目,kcptun也增加了--tcp选项,模拟TCP协议传输数据。但缺点很明显,就是有平台限制,很多只能用于Linux,还需要root权限。如果简单地将UDP封入TCP连接传输又受制于操作系统对TCP的流控,使用kcp又变得毫无意义。而使用TCP BBR也有系统限制。
不过,丢包等因素对TCP的影响仅限于受到影响的连接,并不会影响到其他TCP连接。比如有10条TCP连接,其中3条遇到了丢包变成了低速连接,其他7条仍然是高速连接。而即使3条变成了低速连接,其传输能力也是单条TCP连接的3倍。
基于此想法,自己曾想动手做一个通过多条TCP连接传输数据的程序,每次将UDP随机封入其中一个TCP传输。直到突然看到了kcptun客户端的--conn参数。此参数默认是1,是否可以改成100,然后配合UDP转TCP的工具(比如udptunnel: https://manpages.ubuntu.com/manpages/artful/en/man1/udptunnel.1.html ,或者另外做一个单进程多连接的程序减少进程数量),就能实现这个想法,通过100条TCP连接传输单个kcptun进程的数据?
这样的做法利用的还是操作系统的TCP/IP协议栈,有很好地跨平台性。不知是否可行?暂时还没有试验过,不知将--conn调成很高的数值(比如100)会不会有什么问题?
刚发现用gost( https://github.com/ginuerzh/gost )可以替代udptunnel。
看到一个差不多已经实现了这个想法地项目:
https://github.com/ihciah/rabbit-tcp
https://github.com/ihciah/rabbit-tcp/issues/12
好像udp2raw是创建一个rawsocket自行处理TCP“外貌”的以太网包(所以需要从链路层就截取对应的以太网包来处理,截取完的以太包在进入内核处理前就被netfilter丢弃掉了),不会被内核的TCP栈处理吧。
好像udp2raw是创建一个rawsocket自行处理TCP“外貌”的以太网包(所以需要从链路层就截取对应的以太网包来处理,截取完的以太包在进入内核处理前就被netfilter丢弃掉了),不会被内核的TCP栈处理吧。
正因为如此,所以每个平台的处理逻辑都不同,无法做到每个平台都用的是同一份代码。
看到一个差不多已经实现了这个想法地项目:
https://github.com/ihciah/rabbit-tcp
使用效果如何?貌似用来用去也就kcptun最暴力
这个方法如果能完美实现,潜力很大,而且比faketcp方法的兼容性好。原理类似tcp多线程下载软件。
实现了类似功能的除了rabbit-tcp还有: https://www.v2ex.com/t/90570 https://www.npmjs.com/package/mtcp
不过以上3个都是把tcp转成多条tcp,目前并没有把udp转成多条tcp的? 而且貌似https://github.com/ihciah/rabbit-tcp/issues/11 目前有一些稳定性问题,另外两个稳定性未知。
期待有udp转多条tcp的实现, 和tcp转多条tcp更完美的实现。
udp转多条tcp我能想到的一些难点:
- tcp的重传是没法关掉的,udp程序一般希望丢了的包不重传,如果用tcp承载那这些本来应该丢掉的包会被重传,拥塞网络影响其他的包发送。如果上层再承载kcptun这样的协议,有双倍重传的问题。
- tcp有head-of-line-blocking效应,用来发udp可能影响实时性。不过如果底层的tcp连接足够多,可以缓解。
(上面两个问题也不是完全解决不了,就是得花费一番功夫)
关于楼主的问题:
基于此想法,自己曾想动手做一个通过多条TCP连接传输数据的程序,每次将UDP随机封入其中一个TCP传输。直到突然看到了kcptun客户端的--conn参数。此参数默认是1,是否可以改成100,然后配合UDP转TCP的工具
--conn 100 的意思应该是把kcptun承载的tcp链接负载均衡到底层100条kcp连接上,比如你有2000个tcp连接,那底层的每个kcp链接会分到20个tcp连接。 貌似并不能把同一条tcp连接拆分后分配给不同的kcp连接。
udp2raw+wireguard+vxlan+bonding Round robin 建立多个wireguard连接(通过udp2raw),配置vxlan 之后获得虚拟的ethernet端口,之后用linux自带的链路聚合Round-robin进行叠加。就能达到底层多连接,上层看却是同一个连接的效果。 参考:https://cizixs.com/2017/09/28/linux-vxlan/ http://www.uni-koeln.de/~pbogusze/posts/LACP_configuration_using_iproute2.html
刚发现用gost( https://github.com/ginuerzh/gost )可以替代udptunnel。
gost的tcp有问题 用一会就断流
tcp模式断流非常厉害,我是弃坑了。觉得目前最稳定的方式还是udp模式+udp2raw,虽然udp2raw会导致降速,但重在稳定,随时打开都是能用的,不至于刷页面和视频一会就挂掉,还是很爽的。
最稳定的方式还是udp模式+udp2raw,虽然udp2raw会导致降速,但重在稳定