-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
去掉端口跳跃时的复制包的行为 #911
Comments
目前代码每次新建 UDPConn 就是为了换一个本地端口,来保证 src/dst 都发生变化以绕过 QoS。。 |
难道我被误导了?之前在改 clash 的代码时,是直接重新创建一个 client,这样两边的端口都会换;然后 clash 的开发者告诉我这样不行,会导致源端口被换,与原版实现不一致…… 我先继续观察吧,目前没有发生 QoS,不知道源端口是不是一个 QoS 因素,毕竟各地的运营商策略不一样。 |
能找到这两者之间实际上的因果联系吗? 触发重连的逻辑时, 也是会重建整个客户端(和 UDPConn)的。 |
无法定位,我不太清楚安卓的运行机制,只是用 Github Actions 来构建,发现去掉复制的代码后就正常: 而且安卓上会出现一些莫名其妙的现象,比如把 ticker 设成 30 秒,它可能 5 秒就触发了,甚至 1 秒内连续触发 2 次。我本以为是时间太短导致跳跃前后连接的状态不一致,于是还检查了上次跳跃的时间,如果太短就不跳跃,但仍然无法解决跳跃后不能翻墙的问题。 |
恰好我曾经是搞 Android 的。 我看了一下你的仓库, hysteria2 的接入似乎有点问题。 Hysteria2 Adapter 的 你可以对比 Hysteria1 Adapter 相同函数的实现, 这里用 opts 创建了一个 为什么必须要用这个 dialer 去创建连接呢? 这是因为在开发 Android VPN 的过程中, 需要对连接 VPN 服务器的 socket 调用 连接服务器时最终调用的 由于在接入 Hysteria2 时没有进行此项修改, 在 udp hop 发生之后, 新创建的 socket 被路由到了 VPN 的 tun 中。 因此才出现了你提到的那种 hop 之后就连不上的问题。 或许我们应该为 Hysteria2 添加一个 API, 用于设置所有 dial 直连 socket 时应当使用的 dialer。 但是, ClashForAndroid 仍然需要正确接入之后, 才可能正常使用 udp hop。 |
好吧,我在 mac 上测试命令行时发现这个参数没传进来,所以没去用它,原来是给其他库的调用者使用的。。 |
没误导你,我试了你这个办法,会导致sing-quic新建一个链接去链接服务器,源端口自然会换 |
看来只能改sing-quic了,我想想办法把quicConn改了😁 |
我在将 hysteria2 与 ClashMetaForAndroid 整合时发现一个问题,发生 hop 时,VPN 就变得无法使用了,虽然读写都仍然有数据,但实际无法使用。
在读代码时发现,现有实现是在端口跳跃时新建一个 UDPConn,把老的关闭,然后通过一个 chan 来缓存收到的包。
我修改了这段逻辑,直接使用原来的 UDPConn,只是在 WriteTo 时选择新的端口,ReadFrom 时无需做任何处理。因为本地端口没变,server:old_port 和 server:new_port 发的包都能收到,并不会造成丢包和连接断开。同时去掉了 chan,也能稍微降低一些开销。
而且这样修改后,与 ClashMetaForAndroid 可以一起正常工作了,原因未知。
#910
The text was updated successfully, but these errors were encountered: