iceonsun/rsock

单独用 kcptun 10Mbps,而加上 rsock 600Kbps

david9991 opened this issue · 33 comments

单独用 kcptun 10Mbps,而加上 rsock 只有 600Kbps,有什么需要注意的吗?

--type tcp 就很慢,--type udp 很正常,难道我这 TCP 被限速了?

rsock开了几个端口

默认 10 个。

sudo client_rsock_Darwin -l xxxx -d en0 -t xxxx --type udp 这样就比较快,不过过断时间可能需要重启一下再能继续通信。
sudo client_rsock_Darwin -l xxxx -d en0 -t xxxx --type tcp 这样就非常慢,10M:600K 这么个速度。
sudo client_rsock_Darwin -l xxxx -d en0 -t xxxx --type all 这样和 tcp 差不多速度。
电信网络。

@david9991

不过过断时间可能需要重启一下再能继续通信

重启这个问题,出现的是不是在比如电脑黑屏休眠再打开的时候?如果是这样,应该是shadowsocks、kcptun状态的问题。只需要关闭shadowsocks(turn shadowsocks off ),再重新打开(turn shadowsocks on)就行。还有这里的过一段时间,指的是过多久?

速度慢这个问题:你把日志贴上来看看。日志在这里:/var/log/rsock/rsock.log 。只需要贴这一个

不是休眠的问题,用着用着不一定什么时候就全挂了。因为我改了 ss 加上了 health-check,所以一挂立马就知道,试着重启一下 rsock 好了,不知道是不是巧合,这块还需要时间来观察。
有时间我取个 log 给你,不过我之前看 log 好像并没看出什么特别的,因为慢的时候好像也并没有产生什么 log。上个网真是折腾那……XD

是一个编译选项和log库的问题。我本地开发测试的二进制和发布到release上的不一样。所以一直没有出现这个问题。明天我修改了重新发布上来

2018-03-26 09:19:43.769 DEBUG [304270] [ISockApp::doInit@60] conf: {"daemon": true, "log": "/var/log/rsock/1", "param": {"cap_timeout": 10, "dev": "en0", "duration": 30, "hash": "hello135", "lcapIp": "y.y.y.y", "ludp": "127.0.0.1:7973", "ports": "10001-10010", "taddr": "x.x.x.x", "type": "tcp", "unPath": ""}, "server": false, "verbose": false}
2018-03-26 09:19:43.770 DEBUG [304270] [RCap::Init@50] filter : tcp and  (ip src x.x.x.x) and  (ip dst y.y.y.y) and (  src portrange 10001-10010 )
2018-03-26 09:19:44.069 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60021-x.x.x.x:10001
2018-03-26 09:19:44.310 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60032-x.x.x.x:10002
2018-03-26 09:19:44.545 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60035-x.x.x.x:10003
2018-03-26 09:19:44.842 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60040-x.x.x.x:10004
2018-03-26 09:19:45.149 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60045-x.x.x.x:10005
2018-03-26 09:19:45.437 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60051-x.x.x.x:10006
2018-03-26 09:19:45.728 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60063-x.x.x.x:10007
2018-03-26 09:19:46.071 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60071-x.x.x.x:10008
2018-03-26 09:19:46.307 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60078-x.x.x.x:10009
2018-03-26 09:19:46.548 DEBUG [304270] [INetGroup::AddNetConn@64] Add INetConn: tcp:y.y.y.y:60080-x.x.x.x:10010
2018-03-26 09:19:46.556 DEBUG [304270] [ClientGroup::Init@43] client, listening on udp: 127.0.0.1:7973
2018-03-26 09:19:48.176 DEBUG [304270] [*ClientGroup::newConn@198] new cconn:127.0.0.1:58035, conv: 2
2018-03-26 09:19:49.016 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:49.016 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:49.069 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:49.069 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:49.069 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:49.069 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:49.069 DEBUG [304270] [ConnReset::Input@44] cmd: 2
2018-03-26 09:19:54.013 DEBUG [304270] [ConnReset::Input@44] cmd: 2

@iceonsun 好使了。

youtube开3个1080p卡不卡

@iceonsun 比单独 KCP 是慢一点儿。开 3 个没试过,不过感觉缓冲比以前慢了点,但可以接受。你这10个端口应该也是 roundrobin 的吧。

@iceonsun 现在速度是很不错的,不过这次好像又出现一段时间后就会断的情况,重启又好了。这回是 --type=tcp。我再观察下现象。

不过这次好像又出现一段时间后就会断的情况,重启又好了

这个断的情况还出现吗。“断”指的是程序崩溃了,还是没速度。我这儿出现断的情况通常是笔记本休眠唤醒的时候,会没速度。这个时候只需要重启客户端shadowsocks(同时也重启了kcptun)就可以了。

@iceonsun 是没速度,Health-check 超时。有没有办法自动恢复?因为我有的 client 是做服务器用,不能一断就重启服务呢。;)

刚刚外网路由器断了一下,然后 health-check 就开始超时了,重启一下 rsock 就又连上了。不知道这是 ss,kcp,rsock 哪个断网后复归有问题。

@david9991 路由器断了等于tcp断了。这个要看中间的一系列路由器怎么处理,如果立即返回RST/FIN,那么rsock会立即重新连接,如果中间的路由器不发这两种flag(当然也不会转发数据),那么会在20s后重新连接。

网络断开不会受到RST/FIN这是有可能的,我自己测试过。

@iceonsun 嗯,那可能是这种情况。下次再断我多等一会儿,看看是否可以自动恢复。

@iceonsun 你有没有试过这么一个情况,就是原本使用 WIFI 连网,然后切换成 iPhone 热点,这时通信就会断掉,再切回 WIFI,rsock 连接也无法恢复,我这次等了 7 分钟也没有恢复。然后试着重启一下 rsock 立刻就能恢复。
PS: 我的 Health-check 是 Layer 7 的,所以应用层恢复才算恢复。Layer 4 health-check 有时候会有假象。
screen shot 2018-03-28 at 8 02 47 pm

看看是否可以自动恢复

普通情况下,你试了可以重连吧。

然后切换成 iPhone 热点

这个没试过。

切换成iphone热点肯定就不能通信了(此时外网网卡不一样),这是正常的。

又切换回wifi的时候,无法连接

你尝试重启一下kcptun看行不行。如果可以的话,就是kcptun和rsock的状态没对上。

我试了下,断网再重新连上,短时间是可以自己恢复的,不能自己恢复时候,我试着重启一下 kcp 还是不走数据,但重启一下 rsock 之后就可以立即恢复。

你把操作步骤按123描述一下,我重现一下现象

  1. ss+kcp+rsock 连接上。
  2. 在服务器一侧断网,或其它任何方式断网,断久一点。(比如把服务端 kill 掉一会)
  3. 恢复网络。
    然后数据就不走了,等几个分也是没有数据的。
  4. 重启 rsock,数据恢复。

这个是因为client尝试重连服务器有次数限制(现在是10次),意思是,当服务器在这10次重试连接期间都还没有运行起来的话,client就不再重试,然后就连接就断了。

我现在把重试设置到无限次。

https://github.com/iceonsun/rsock/releases/tag/v1.7.1

你再试试,可以了就关掉这个issue

Tag 打错了?不应该是 9e09951

一样的。master从dev cherry-pick过去的

https://github.com/iceonsun/rsock/archive/v1.7.1.tar.gz 里面并没有你 master 里改的内容。你再确认一下二进制是用 master 编的还是用 v1.7.1.tar.gz 编的?
这次我把服务端停了 10 分钟然后启动,结果数据并没有恢复。
screen shot 2018-04-01 at 4 01 54 pm

好吧,我用 master 重编了一下也没能自动恢复……必须把 rsock 重启才能恢复。
screen shot 2018-04-01 at 4 20 35 pm

编进去了的。只不过是我先在dev上编了二进制,发布release,再cherry-pick 到master,最后 push 到github上。

发布的二进制压缩文件(https://github.com/iceonsun/rsock/releases/tag/v1.7.1)里面有VERSION.txt

其中commit version为 9e099513a154a3bc6198a5e2152d95a50e71913e

这个和最新的master是一样的(git diff 9e099513)没有输出。v1.7.1 release出的source code.zip估计是按照发布二进制时master的快照(本地还未push到github master),所以比较旧。

就发布这个事,下次我先更新master后发布二进制

我用 master 重编了一下也没能自动恢复

这个是你clone下来的master,还是v1.7.1 发布页面的source code。

也没能自动恢复

重试是有时间间隔的, 1s->2s...32s->1s, 这样不断重试。最多不超过32s。我看图表中只等待了2s。

我是 clone 下来的 master。
图上第一列是 RTT,最后一列才是断线时间。是 15 分钟。也就是断开 10 分钟之后,恢复连接又等了 5 分钟还是 down 的状态。

我是这么测试的:

服务端kill掉rsock,等待10分钟,再启动rsock。client整个过程不动。

server起来以后,隔不久就看到client重连成功。此时已通。

重连这个的变更,主要改变在client。你确认一下, 启动有啥问题没(比如有旧的client在运行)。

停了 10 分钟

这个停了,指的是断网,还是kill 掉rsock

我和你的步骤一样。但我对「通」的定义是 health-check 会通过 rsock -> kcp 给 ss 发一个 PING,ss 通过 kcp -> rsock 回一个 PONG。我再试一次。

这回好使了。可能上次网络本身就是不好使。