用 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 或者贡献代码,蟹蟹!

10384 次点击
所在节点    分享创造
44 条回复
mywaiting
2019-10-16 22:17:28 +08:00
希望楼主可以折腾一下,实现一套私有的多 IP 多链接下,类似于 Multipath TCP 的协议

实现这样的一套协议,其数据天生就是乱序的,每个数据包的 payload 甚至只需基本的 rc4 加密即可,天然拥有出国的属性
mywaiting
2019-10-16 22:26:36 +08:00
附带很多年前看到的云风大牛的实现,一同分享 blog.codingnow.com/2015/07/mptun.html
ihciah
2019-10-16 22:53:23 +08:00
@mywaiting 之前想过,做类似 Tinc 的 mesh vpn,但是流量会被分拆并多路传输的东西。权重怎么 update 感觉是个挺蛋疼的算法问题。
mywaiting
2019-10-16 22:57:42 +08:00
@ihciah 你可以看看我给的链接的,里面有个很简单的粗暴的权重计算方法,没有那么的蛋疼
wwqgtxx
2019-10-16 23:52:51 +08:00
@Jirajine 是这个意思,其实是解决一下垃圾校园网限速,我这边单账户限速 500k/s,用 20 个账户加 mwan3 均衡负载弄出来了一个 100mbps 的宽带,然后我有个百兆口的国内 vps,就看看能不能改善一下和这台 vps 的单线程通讯效率(用 frp 进行 rdp 转发)
Jirajine
2019-10-17 00:10:28 +08:00
@wwqgtxx 简单实现一个应该不难,但想要优雅一些,涉及到路由算法,传输控制,考虑到不同出口不同的时序造成的抖动,想要减少重传增加利用率降低时延并不容易。
这真的是很小众的需求,楼上提到的在混淆流量对抗 GFW 方面的应用能有多少效果我表示怀疑,关键是需要有一个相对良好的实现,不能在小文件大并发方等面产生太大的副作用。
还有,也许再过几年,TCP 都要淘汰了呢,自己实现传输控制协议灵活性更大一些。
missdeer
2019-10-17 08:31:26 +08:00
摸摸头,上海电信 KCP 没被 QoS,速度比 TCP 直连快很多倍
justfly
2019-10-17 09:57:25 +08:00
@ihciah #10 多谢,了解了。
zhaishunqi
2019-10-17 10:04:37 +08:00
如果能突破贷款限制就牛皮了~
zhaishunqi
2019-10-17 10:04:48 +08:00
@zhaishunqi 带宽。。。
azh7138m
2019-10-17 11:01:28 +08:00
@wwqgtxx 可以做,Dialer 可以指定 LocalAddr
然后就是某一路存在问题的时候,这部分流量要怎么处理
等一个好心人来实现
samwalt
2019-10-17 15:46:44 +08:00
学习一下
lemonda
2019-10-19 13:44:14 +08:00
Win 下测试速度比较慢,下载速度时快时慢,进度条有时候卡住。
有点奇怪做为插件时 serviceAddr 的写法,RabbitTCP Server<--> SSLibev,SS 的 IP:Port 不是应该写在服务器端么,怎么这个是写在本地端?会把 IP:Port 传输到服务器吗
ihciah
2019-10-19 22:34:19 +08:00
@lemonda
速度不稳定可能是正常的。因为数据到达不一定有序,会等待有序块到达后才从缓冲区返回给客户端。
卡住不太清楚原因,有可能是速度太慢了?如果等待缺失块&&等待期间没有任何块(并不特指这个缺失块)到达,这个状态持续几秒钟(写死的常量)就会认为这个连接死掉了然后强制中断掉。(我觉得大概率是我写炸了…但是我这边还挺正常的…🤣)
这个和 KCPTUN 的方式不同,目标地址是客户端传给服务端的。这样的好处就是加速多个服务可以共用同一个服务端。
Allianzcortex
2019-10-27 22:57:14 +08:00
唔 楼主的 CI 是怎么做的?没有用常见的 .travis / .circleci ?
Allianzcortex
2019-10-27 23:01:30 +08:00
原来是 github workflow.... 研究一下去(lll ¬ω¬)
todragon
2019-11-26 10:14:12 +08:00
楼主不更新了吗?
ihciah
2019-11-26 10:16:30 +08:00
@todragon 最近比较忙…过了这阵
todragon
2019-11-26 10:23:19 +08:00
刚刚测试了一下,测速软件 speedtest 和 fast 都导致连接中断,重启客户端后恢复。
ihciah
2019-11-26 10:30:03 +08:00
@todragon 是的,目前还有一些稳定性问题。忙完这阵修🤣

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

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

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

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

© 2021 V2EX