keakon

Results 15 comments of keakon

> 目前代码每次新建 UDPConn 就是为了换一个本地端口,来保证 src/dst 都发生变化以绕过 QoS。。 难道我被误导了?之前在改 clash 的代码时,是直接重新创建一个 client,这样两边的端口都会换;然后 clash 的开发者告诉我这样不行,会导致源端口被换,与原版实现不一致…… https://github.com/MetaCubeX/mihomo/issues/982#issuecomment-1892276068 我先继续观察吧,目前没有发生 QoS,不知道源端口是不是一个 QoS 因素,毕竟各地的运营商策略不一样。

> 能找到这两者之间实际上的因果联系吗? 无法定位,我不太清楚安卓的运行机制,只是用 Github Actions 来构建,发现去掉复制的代码后就正常: https://github.com/keakon/ClashMetaForAndroid/commit/0c2c4892873e3ea9c198a12784aa8be8411d8ef5 日志里确实能看到读写都有数据,但是手机却无法翻墙,而在第一次发生端口跳跃前的时间是能翻墙的。 而且安卓上会出现一些莫名其妙的现象,比如把 ticker 设成 30 秒,它可能 5 秒就触发了,甚至 1 秒内连续触发 2 次。我本以为是时间太短导致跳跃前后连接的状态不一致,于是还检查了上次跳跃的时间,如果太短就不跳跃,但仍然无法解决跳跃后不能翻墙的问题。

好吧,我在 mac 上测试命令行时发现这个参数没传进来,所以没去用它,原来是给其他库的调用者使用的。。

@wwqgtxx 我 copy 了 hysteria 的源码,目前 TCP 是正常的,UDP 我平时用不到,不确定这么改是否正确,需要帮忙看下。这2天得了流感,实在研究不动了。 #990

写了个UDP服务来测试,没遇到问题。但是我并没有用到 ctx、opts 这 2 个参数,不清楚是否对于控制超时、连接有什么特殊用处。

这个实现在与 ClashMetaForAndroid 一起使用时会遇到 hop 后无法继续使用的 bug,原因未知。并且还发现 ticker 在未到期时多次触发的 bug,也不知道原因。

修改了 hop 的实现,不去复制 packets 就正常了。

> ``` > Hysteria2Option{ > Up string `proxy:"up,omitempty"` > Down string `proxy:"down,omitempty"` > } > ``` > > up和down还是允许为空吧,和以前的格式不兼容了 已修复

> 大佬你好,我魔改了sing-quic库,newClient的时候调用client 的offerNew()函数,然后也是通过ticker触发NewClient给他创建新的client 实际使用很完美,"端口跳跃"了,新的client中conn可以直接使用,不会断流,核心思想就是到了切换时间,先建立连接,再切换client,不需要等到流量到了client.offer出现错误的时候再去建立连接,我愿称他为伪端口跳跃,这个实现方式怎么样? 我不是大佬啊。 看上去可能会有额外的开销,你可以看看 offerNew() 里的后半段,创建了一个 http3.RoundTripper 对象来发起认证请求。 开销最低的方式就是我现在的方案,直接复用之前的连接,往其他端口写,但这不符合原版实现。 其次是创建一个新的 UDP 连接,但是需要同时监听和读写两个连接的数据,说实话这更适合用 epoll 来写(不过不跨平台)。

> 看了下代码做了些猜测,应该配置是这样的 > > ```yaml > ports: 2333-23333, > hop-interval: 45, > ``` > > CMFA也是一样的配置,测试没有报错,但不知实际是否用上了端口跳跃 ports 启用时,忽略 port 的设置(但是 port 仍然必填)。 hop-interval 默认为 30 秒。 设置 log-level: debug 就可以看到端口跳跃的日志了。