全球主机交流论坛

标题: [开源] 或许是目前性能最好的ws隧道(狂 [打印本页]

作者: dunce    时间: 2022-4-9 22:25
标题: [开源] 或许是目前性能最好的ws隧道(狂
本帖最后由 dunce 于 2022-4-9 22:33 编辑

仓库: https://github.com/zephyrchien/kaminari

基于我亲自实现的ws库,要比其他通用ws库高效得多。其他库都在底层维护了一个fifo缓冲区,并且只能整读整写,使用的时候往往还需要再加一层缓冲。而我的库利用栈上缓冲保存状态(127b以内),直接指示出每次需要读写的数据范围,不需要额外在堆上分配内存。

食用姿势:

  1. kaminaric <local_addr> <remote_addr> <options>

  2. kaminaris <local_addr> <remote_addr> <options>
复制代码


也可以作为Shadowsocks插件食用:

  1. sslocal ... --plugin <path/to/kaminaric> --plugin-opts <options>

  2. ssserver ... --plugin <path/to/kaminaris> --plugin-opts <options>
复制代码


WS转发例子:
  1. kaminaric 127.0.0.1:10000 127.0.0.1:20000 'ws;host=example.com;path=/ws'

  2. kaminaris 127.0.0.1:20000 127.0.0.1:30000 'ws;host=example.com;path=/ws'
复制代码


WSS转发例子:
  1. kaminaric 127.0.0.1:10000 127.0.0.1:20000 'ws;host=example.com;path=/ws;tls;sni=example.com;insecure'

  2. # use cert + key
  3. kaminaris 127.0.0.1:20000 127.0.0.1:30000 'ws;host=example.com;path=/ws;tls;cert=example.com.crt;key=example.com.key'

  4. # generate self signed cert/key
  5. kaminaris 127.0.0.1:20000 127.0.0.1:30000 'ws;host=example.com;path=/ws;tls;servername=example.com'
复制代码


Options具体含义请看文档。

EDIT: PS:
是标准的WS实现喔,可以穿CDN,也可以配合Nginx, Haproxy等中间件食用。不强制你使用kaminaris作为服务端,这跟某些玩具是有着本质的区别的(锐评一把
作者: dunce    时间: 2022-4-9 22:26
晚点会把这些功能移植到Realm上,支持多节点转发。
作者: hcyme    时间: 2022-4-9 22:27
先谢再看再收藏
作者: rooney    时间: 2022-4-9 22:27
挺好的,感谢分享!
作者: mjj天下第一    时间: 2022-4-9 22:28
好久才见一次的技术贴
作者: load1ng    时间: 2022-4-9 22:30
插个眼
作者: 吹风秀跳刀    时间: 2022-4-9 22:30
dunce 发表于 2022-4-9 22:26
晚点会把这些功能移植到Realm上,支持多节点转发。

大佬可以搞个方便使用的脚本吗,感谢大佬
作者: naohjohn    时间: 2022-4-9 22:30
加一个效率测试是不是就可以发paper了
作者: motao    时间: 2022-4-9 22:31
谢谢老哥分享
作者: DaoChen    时间: 2022-4-9 22:32
挺久没见技术贴了,加油楼主
作者: mytk-asa    时间: 2022-4-9 22:34
支持一下
作者: xxhjkl    时间: 2022-4-9 22:34
有没有小白版的教程
作者: flyin    时间: 2022-4-9 22:36
mark

作者: host0108    时间: 2022-4-9 22:37
rust大佬,太牛了。。。。。。。。。。
作者: zaojiapai    时间: 2022-4-9 22:38
顶顶更健康
作者: march1993    时间: 2022-4-9 22:40
所以比golang的channel高出多少性能?
作者: my2468    时间: 2022-4-9 22:42
赞赞赞
作者: ASDC    时间: 2022-4-9 22:46
小白看不太懂,先收藏了
作者: 枝江小狼王    时间: 2022-4-9 22:48
好好好,支持技术贴
作者: plusiy    时间: 2022-4-9 22:55
来个一健脚本
作者: huang1dede    时间: 2022-4-9 22:56
看不懂,,,不知道怎么结合v2梭哈
作者: lijihede    时间: 2022-4-9 22:58
这个看起来不错
作者: adminii    时间: 2022-4-9 23:11
可以,大佬就是大佬
作者: wycrow    时间: 2022-4-9 23:16
难得有活跃的开发者 已star
作者: Amanda    时间: 2022-4-9 23:20
技术贴必须顶,好久没有这种干货了
作者: JustBeHappy    时间: 2022-4-9 23:24
技术贴,收藏,围观
作者: HOH    时间: 2022-4-9 23:26
我只选择libwebsockets
作者: 钱宗鑫    时间: 2022-4-9 23:26
我去给一个star
作者: A1s2    时间: 2022-4-9 23:26
技术老牛逼
作者: Caffine.    时间: 2022-4-9 23:28
顶一波
作者: 科技    时间: 2022-4-9 23:28
牛啊牛
作者: 喵霸天    时间: 2022-4-9 23:41
等机场使用就行了
作者: 003    时间: 2022-4-9 23:44
好帖必顶
作者: YIMSHING    时间: 2022-4-10 00:08
技术贴必须赞
作者: TechBlack    时间: 2022-4-10 00:22
有iperf测速对比吗
作者: cachexy    时间: 2022-4-10 00:48
真的牛逼,学习了
作者: 安妮炖熊    时间: 2022-4-10 01:10
技术贴!顶
作者: 三氧化二砷    时间: 2022-4-10 01:26
支持udp over tcp 吗
作者: yi339999    时间: 2022-4-10 01:27
支持技术大佬,希望出个教程
作者: liuyun    时间: 2022-4-10 01:31
只想要一建v2
作者: yoyoss    时间: 2022-4-10 01:33
先收藏再看 楼主加油
作者: 祭徐坤    时间: 2022-4-10 01:36
rust 大佬牛批
作者: squ33ker    时间: 2022-4-10 01:42
感谢分享~ 支持支持!
作者: 铅笔    时间: 2022-4-10 02:46
很久没见技术佬了
作者: lsin    时间: 2022-4-10 03:15
只能说牛
作者: dole    时间: 2022-4-10 03:16
马克
作者: s920361    时间: 2022-4-10 03:19
能不能支援warp 扶墙 client id?
作者: tinyfish    时间: 2022-4-10 09:24
不错,又多了个工具
作者: 表妹    时间: 2022-4-10 09:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 行尸走肉    时间: 2022-4-10 09:46
等一波速度测试
作者: Contribute    时间: 2022-4-10 09:52
https://github.com/vi/websocat

这个也是rust写的ws隧道,楼主可以对比一下
作者: kagurazakashira    时间: 2022-4-10 09:57
草~
很难不支持,终于有个不是golang的ws tunnel了
作者: suichang    时间: 2022-4-10 09:58
不能减少rtt没啥区别,吞吐量对个人用户影响不大了。
作者: terrytw    时间: 2022-4-10 10:11
呃,既然是SIP003的话,能否上架google play呢
作者: WZ-Software    时间: 2022-4-10 10:12
技术贴,帮顶,感谢分享
作者: Laa    时间: 2022-4-10 10:25
高技术 膜拜
作者: dunce    时间: 2022-4-10 14:13
HOH 发表于 2022-4-9 23:26
我只选择libwebsockets

敢写个应用出来bench吗
作者: dunce    时间: 2022-4-10 14:15
Contribute 发表于 2022-4-10 09:52
https://github.com/vi/websocat

这个也是rust写的ws隧道,楼主可以对比一下

我写之前就看过那几个ws库(rust和go最火的4个)的源码了,不然也不至于闲的没事自己撸个库
作者: dunce    时间: 2022-4-10 14:17
suichang 发表于 2022-4-10 09:58
不能减少rtt没啥区别,吞吐量对个人用户影响不大了。

可以0rtt,实现起来没啥难度。 握手的时候在http headers里塞个base64过的数据就完事了
作者: ac1083819963    时间: 2022-4-10 14:17
希望能出个一键脚本
作者: 糟糕的鲍勃    时间: 2022-4-10 14:22
牛逼,谢谢大佬分享
作者: dunce    时间: 2022-4-10 14:22
本帖最后由 dunce 于 2022-4-10 14:24 编辑
kagurazakashira 发表于 2022-4-10 09:57
草~
很难不支持,终于有个不是golang的ws tunnel了


golang写的那几个隧道或多或少都有问题,不止是性能方面(毕竟都是调现成的包,都免不了额外的拷贝),有的是连正确性都没法保证,简直就是瞎写,同时代码质量感人 = -
作者: 追叶    时间: 2022-4-10 14:23
不明觉厉 这个是干什么用的呢
作者: suichang    时间: 2022-4-10 14:24
本帖最后由 suichang 于 2022-4-10 14:25 编辑
dunce 发表于 2022-4-10 14:17
可以0rtt,实现起来没啥难度。 握手的时候在http headers里塞个base64过的数据就完事了 ...


说的是tls rtt,就算tls1.3也比酸慢那么一点,长连接又不太稳。
作者: 凌寒    时间: 2022-4-10 14:24
来个一键脚本或者简明版的教程吧
作者: dunce    时间: 2022-4-10 14:25
三氧化二砷 发表于 2022-4-10 01:26
支持udp over tcp 吗

没有udp,单纯的ws转发罢了( 你阔以在前面套一个UoT工具
作者: dunce    时间: 2022-4-10 14:26
suichang 发表于 2022-4-10 14:24
说的是tls rtt,就算tls1.3也比酸慢那么一点,长连接又不太稳。

tls1.3也可以0rtt,  tcp也可以 fastopen.  还想快的话就得用基于udp的协议了,或者直接发ip数据报
作者: corolo    时间: 2022-4-10 14:42
支持技术贴
作者: joyoner    时间: 2022-4-10 15:26
希望可以支持udp
作者: 云烟    时间: 2022-4-10 16:14
技术贴哟~!收藏了
作者: huanx    时间: 2022-4-10 16:16
感谢分享 没有中转鸡
作者: diocat    时间: 2022-4-10 16:22
对目前主流的ws隧道,用iperf3本地回环互拉来横向对比,更有说服力
作者: dunce    时间: 2022-4-10 16:39
diocat 发表于 2022-4-10 16:22
对目前主流的ws隧道,用iperf3本地回环互拉来横向对比,更有说服力

得有人做个全面的测试。单从代码层面来看,我的ws实现绝对是最快的
作者: micms    时间: 2022-4-10 16:46
mark大佬
作者: darius    时间: 2022-4-10 17:32
我来当小白鼠对比gost试试
作者: hcyme    时间: 2022-4-10 17:34
正在编译原版,做ss插件看看疗效
作者: 肤白貌美天然呆    时间: 2022-4-10 17:38
有大佬编译成品么
作者: dunce    时间: 2022-4-10 17:39
肤白貌美天然呆 发表于 2022-4-10 17:38
有大佬编译成品么

有现成的release啊, github action自动编译发布
作者: xc55    时间: 2022-4-10 17:41
技术贴,顶起来
作者: 肤白貌美天然呆    时间: 2022-4-10 17:44
dunce 发表于 2022-4-10 17:39
有现成的release啊, github action自动编译发布

方便问下gnu和musl  这俩应该怎么选择么? 查到的说是一个动态 一个静态  不知道怎么选择了...
作者: dunce    时间: 2022-4-10 17:47
肤白貌美天然呆 发表于 2022-4-10 17:44
方便问下gnu和musl  这俩应该怎么选择么? 查到的说是一个动态 一个静态  不知道怎么选择了... ...

最大的区别就是动态链接和静态链接。gnu需要你机器上有比较高版本的glibc,不然没法启动。 musl就没有这些问题,不过性能比gnu稍微弱一点点
作者: 肤白貌美天然呆    时间: 2022-4-10 17:49
dunce 发表于 2022-4-10 17:47
最大的区别就是动态链接和静态链接。gnu需要你机器上有比较高版本的glibc,不然没法启动。 musl就没有这 ...

好的 谢谢   搞一下试试
作者: 刚刚好先生    时间: 2022-4-10 17:52
实在看不懂...收藏下
作者: 橘橘橘    时间: 2022-4-10 17:53
支持大佬,感谢分享
作者: bigexiu    时间: 2022-4-10 19:14
技术大佬
作者: HOH    时间: 2022-4-10 19:22
dunce 发表于 2022-4-10 14:13
敢写个应用出来bench吗


怎么说呢,这个东西的需求定位你没搞清楚,这是拿来过桥用的,速度和效率自然取决于桥,所以100M和1000M对于使用者来说并没有什么区别,而重点是如果是自己维护一套底层的话如果将来出现了漏洞之类的安全问题的话,那将可能面临无人维护的处境,这就是为什么尽量使用成熟的公共库的原因,虽然并不是说自己再造一套不好,只是对于用户负责的意思。说回来这种东西,就是安全、稳定,至于性能那并不是最重要的。
作者: zhujizixun    时间: 2022-4-10 19:28
wss支持吗 ws没卵用啊
作者: dunce    时间: 2022-4-10 19:58
zhujizixun 发表于 2022-4-10 19:28
wss支持吗 ws没卵用啊

你这是连帖子都没看吗
作者: dunce    时间: 2022-4-10 23:32
HOH 发表于 2022-4-10 19:22
怎么说呢,这个东西的需求定位你没搞清楚,这是拿来过桥用的,速度和效率自然取决于桥,所以100M和1000M ...

=-=我一开始的意思是talk is cheap。我个人是不满足于现状的。在都能跑满带宽的前提下,如果能进一步降低cpu和内存占用,何乐而不为?

造轮子之前我就看了不下4个ws库(rust和go)的源码,rust的库只是没法满足我的需求; go的库则是代码质量感人,看得我蛋疼,更不可能满足我的需求。想到有些蛋疼的go选手用着蛋疼的go库,写出了蛋疼的玩具,我为用户深深的感到蛋疼。。于是我更觉得有必要做个质量好点的东西来打破go在这方面的垄断了

btw,c那么弱的抽象能力,写出来的库用着不蛋疼吗,至少我是不会去用的。就算是cpp, 如果不上c++20协程的话,性能也打不过rust
作者: dunce    时间: 2022-4-10 23:36
本帖最后由 dunce 于 2022-4-10 23:57 编辑
HOH 发表于 2022-4-10 19:22
怎么说呢,这个东西的需求定位你没搞清楚,这是拿来过桥用的,速度和效率自然取决于桥,所以100M和1000M ...


至于安全和稳定,完全可以信任rust(虽然我写了不少unsafe)。ws协议本身很简单,我自认为代码质量很好(至少吊打这类工具用的最多的go开发者的平均水平),不存在维护难度一说。每个文件都有单元测试(一共40多个),整个库还有整体测试,握手,echo,几条ws对拷 (同步+异步),还能有啥问题呢~
作者: Niwi    时间: 2022-4-10 23:38
要有对比才行阿
作者: dunce    时间: 2022-4-10 23:42
本帖最后由 dunce 于 2022-4-10 23:45 编辑
Niwi 发表于 2022-4-10 23:38
要有对比才行阿


得有人发正经评测(网速,延迟,cpu和内存占用等)。我自己就跑跑本地测试, 裸ws速度不会逊色于其他工具的tcp(无零拷贝,都使用8kb内存拷贝的情况下)
作者: Niwi    时间: 2022-4-11 13:43
dunce 发表于 2022-4-10 23:42
得有人发正经评测(网速,延迟,cpu和内存占用等)。我自己就跑跑本地测试, 裸ws速度不会逊色于其他工具的 ...

最好在github上贴一下性能对比,延时、带宽、cpu、内存占用之类的数据,可以在本地测试
作者: option    时间: 2022-4-11 14:51
arm 套ss 使用有问题
作者: tycu    时间: 2022-4-11 14:53
支持一下
作者: mjj666zzz    时间: 2022-4-11 15:02

作者: darksheen    时间: 2022-4-11 15:04
支持技术贴
作者: dunce    时间: 2022-4-11 15:21
option 发表于 2022-4-11 14:51
arm 套ss 使用有问题

我早上起来脑子抽了,把local和remote写反了, v0.3.1已经修复。 btw, 手机客户端可以用v2ray-plugin, 需要给v2ray加一个mux=0参数,把mux关掉
作者: option    时间: 2022-4-11 15:49
dunce 发表于 2022-4-11 15:21
我早上起来脑子抽了,把local和remote写反了, v0.3.1已经修复。 btw, 手机客户端可以用v2ray-plugin, 需 ...

新版可以了,试过ws nginx http 转发可以了。
但又有个问题,我现在用v2ray-plugin 可以直接使用cf的ip,cf去卸载ssl转发http(v2ray-plugin不配置tls),在客户端原配置加个tls 可以变成wss使用了 。

同方法,这个不行,加了tls;sni=domain都不行   报错: PR_END_OF_FILE_ERROR   
作者: Nanhumly    时间: 2022-4-11 15:50
感谢分享




欢迎光临 全球主机交流论坛 (https://lilynana.eu.org/) Powered by Discuz! X3.4