用 Golang 糊了一个 TCP 双边加速器

2019-10-16 17:23:36 +08:00
 ihciah

用 Golang 糊了一个支持任意 TCP 流量的双边加速器 Rabbit TCP

https://github.com/ihciah/rabbit-tcp

原理

原理和我以前糊的某软件加速器差不多,通过建立多条 TCP 连接来承载上层用户连接,达到加速效果。

这个过程会将上层连接的流数据拆成块,通过底层连接加密传输。底层连接持续存在,一定程度上还改变了流量的时序特征。

大致示意图是这样(小学生画图水平 2333 ):

为什么不用 KCP

我这边的 ISP 是上海联通,UDP 流量稍微多一点点就会直接掉到 1Mbps,UDP 流量是非常容易被 QoS 的。不巧我就是那个被 QoS 的。

部署

支持一键 docker-compose 部署。作为小白鼠用了一周了,稳定性没问题的。

效果

加速:

无加速:

End

希望本项目能帮到更多的人,同时也希望你可以提出 issue 或者贡献代码,蟹蟹!

10219 次点击
所在节点    分享创造
43 条回复
tulongtou
2019-10-16 17:33:05 +08:00
支持一下 试试
huyujievip
2019-10-16 17:36:03 +08:00
试试,这个加速效果还是不错的呀
justfly
2019-10-16 17:39:11 +08:00
如果 client 和 server 之间的带宽是固定的,在这两者之间用单个 tcp 和多个 tcp 最终表现出速度差异的原理是什么呢,最终还是要传输相同的 IP 包。

server 端搞个 bbr 也许会更好一些。
est
2019-10-16 17:40:38 +08:00
看上去像一个 demuxer ?如果支持多 ip 绑定就 6666 了。发送接受都多 ip。这样根本没法分析协议。
ihciah
2019-10-16 17:43:12 +08:00
@justfly 和下载器的原理类似,多打连接就能尽量吃满带宽。
和 BBR 不矛盾的,开了 BBR 会有一定提升。

@est 多 ip 绑定具体是说?
est
2019-10-16 17:48:39 +08:00
@ihciah

> 通过建立多条 TCP 连接来承载上层用户连接


每一个 tcp 连接的五元组都不一样。

因为服务器和客户端多网卡。每个网卡都可以绑多个 ip 的。但是 middle box 分析起来就费劲儿了。


=========================


另外

> 当然坏处也是有的,因为负载的是任意 TCP 流量,并且需要隐藏 Block 数据包格式,所以这里需要在最外层做一次加密,对于 ShadowSocks 这种流量已加密的协议,相当于多做了一次加解密,会有一定的性能消耗。另一个坏处是可能需要做 QoS (目前没有实现),否则所有承载的流量权重相等,可能会有使用体验上的不适。

我感觉可以完全新搞一个协议了。hhhh。

如果自己重新设计一个协议,我的建议是允许 junk bytes。也就是未观察到符合目标字节之前允许插入任意乱码。这样为以后协议可混淆可扩展打下基础。
justfly
2019-10-16 18:27:10 +08:00
@ihciah 我理解和下载器的原理是不一样的。

我们下载的文件在多个主机上,它通过和多个主机建立 tcp,分别下载不同的部分,因为每个主机到本机的带宽独立,所以加起来下载器会得到一个比较高的速度,跑满运营商分配给自己的带宽。

对于一个 client 和 server 端的情况,带宽固定,能获得加速的原理是啥呢,我很好奇。
wssy
2019-10-16 18:49:14 +08:00
@justfly 可能是说单条 tcp 会被控制?
Laynooor
2019-10-16 19:26:44 +08:00
试了一下,Speedtest 单线程 70Mbps,加速后可以跑单线程 150Mbps,效果很不错。

等会晚上 10 点 11 点的时候再试一下,那时候会被 Qos 到 3Mbps...
ihciah
2019-10-16 19:50:55 +08:00
@est 感谢!这个项目初衷只是加速,混淆什么的可能要后续再加了。。多网卡那个,是不是 iptables 也可以搞定?我用 iptables 做过多端口的服务。

@justfly TCP 有运营商的 QoS。因为不可能说你 1000M 宽带的下载国外的一个大文件就真的吃 1000M 的国际出口带宽,僧多粥少只能按人头分,多个连接就是多派几个人去分粥嘛。

@Laynooor 联通网络贼差!到了晚上也是炸的不行。。
wwqgtxx
2019-10-16 20:39:56 +08:00
话说这种在多出口网络的情况下能正常使用么(比如多拨,或者有多条宽带出口 ip 不同,但是服务器 ip 唯一的情况下)
ihciah
2019-10-16 21:14:22 +08:00
@wwqgtxx 应该不影响。但是因为数据块是随机选择连接发送,所以如果你的线路延迟差距较大,可能最终延迟会出现不稳定的情况。但是正常使用没问题的(应该)。。
Jirajine
2019-10-16 21:16:55 +08:00
@wwqgtxx 你是指单线程链路聚合吗?
理论上你有 10 条 100m 宽带配合一个 G 口代理服务器应该可以。
ericls
2019-10-16 21:20:59 +08:00
HTTP 3 出来 会改变运营商对 UDP 的限制吗?
Laynooor
2019-10-16 21:22:01 +08:00
似乎有 BUG,会导致断流?必须重启 docker 才能恢复。
情况 1:刚设置好 Rabbit,进行 Speedtest 测速,峰值带宽 150Mbps,下载测速完成之后断流,提示网络错误。重启客户端后恢复。

情况 2:设置好后只是挂上某软件没有跑流量,过 1 个小时后再去用,发现网络错误。重启客户端后恢复。

有日志可以查看吗?或许可以帮助解决这个问题
fengtons
2019-10-16 21:27:59 +08:00
相当于以前的网络蚂蚁?
est
2019-10-16 21:35:38 +08:00
@ihciah iptables 是可以搞定。但是麻烦。。

其实绑网卡就是 listen() 的时候传入一个 ip。。。
ihciah
2019-10-16 21:36:09 +08:00
@Laynooor 我这边客户端跑在 NAS 上,日常全用这个还挺正常。(那个插件可能有点不稳定,原因未知)
debug 的话可以改一下 verbose,然后 docker-compose logs 可以打 log。
shansing
2019-10-16 21:44:41 +08:00
不错诶。之前就经常有单线程速率不如多线程的情况,这下可以提速了。
weyou
2019-10-16 22:04:49 +08:00
其实类似于底层放了一个多线程下载器。将上层的所有的 tcp 连接都拆成多路并行传输。我猜这种方式对数据量较小的网页浏览,联机游戏应用的加速应该不明显,甚至会有劣化效果,而对于在线视频,大文件下载会有不错的效果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609993

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX