apernet / hysteria

Hysteria is a powerful, lightning fast and censorship resistant proxy.
https://v2.hysteria.network/
MIT License
14.69k stars 1.64k forks source link

服务端重启后,既存客户端需要等待十几秒才能重新开始发送代理请求 #1033

Closed right0808 closed 5 months ago

right0808 commented 5 months ago

为什么启动和重启都很慢呢,都需要等待几秒才有效? 而且,我是配置了:--disable-update-check,这个选项的,难道还需要添加其他的参数,才能快速有效? 或者说,下面的这种配置方法不可以? /usr/local/bin/hysteria-linux-amd64-avx server --config /etc/hysteria/config.yaml --disable-update-check --log-level=error

tobyxdd commented 5 months ago

因为 ACME 吧

right0808 commented 5 months ago

但是,我使用的是自己的证书,不是让它去申请哦

haruue commented 5 months ago

试了下启动挺快的, 能否提供一下你那边的服务端配置以及执行你提供的那条命令的输出, 我们复现一下问题

root@apernet-hk3:/etc/hysteria # date --rfc-3339=ns; hysteria server -c config.yaml
2024-04-19 23:48:25.480813223+08:00
2024-04-19T23:48:25+08:00       INFO    server mode
2024-04-19T23:48:25+08:00       INFO    traffic stats server up and running    {"listen": "127.0.0.1:9999"}
2024-04-19T23:48:25+08:00       INFO    server up and running   {"listen": ":11443"}
TrayBer commented 5 months ago

一直以来也被这个问题困扰,表现为:每次解锁手机(锁屏时间大概超过5分钟),都需要等待5秒左右,才能建立起 hysteria2 代理连接,否则访问墙外服务都报错。一旦建立起连接,例如持续看 YouTube 视频,很少出现连接中断的情况。

这个故障导致 Gmail 等无法锁屏接收邮件通知。

Android 13,PixelExperience 系统,使用 Clash Meta for Android 客服端,客户端电源管理设置为无限制,开启自启动。

切换到其它代理协议(如 VMess、VLESS、Trojan 等)则恢复正常。

服务端配置如下:

cat << EOF > /etc/hysteria/config.yaml
listen: :443        # 监听端口

# 使用自签证书
tls:
  cert: /etc/hysteria/server.crt
  key: /etc/hysteria/server.key

auth:
  type: password
  password: password         # 设置认证密码

masquerade:
  type: proxy
  proxy:
    url: https://bing.com    # 伪装网址
    rewriteHost: true
EOF
right0808 commented 5 months ago

是的,启动是很快的。但是初次建立连接慢。一旦能建立连接后就没有问题了。 怀疑是代码在已经默认有证书的情况下,还去申请了证书,或者已有geo文件,还去下载geo配置。

命令行: /usr/local/bin/hysteria-linux-amd64-avx server --config /etc/hysteria/config.yaml --disable-update-check --log-level=error

配置如下: ccc@s3:/etc/hysteria$ cat config.yaml listen: :5000

tls: cert: /usr/local/ssl/XXX/fullchain.cer key: /usr/local/ssl/XXX/_.XXX.xyz.key

auth: type: password password: XXXXXXX

masquerade: type: string proxy: url: https://news.ycombinator.com/ rewriteHost: true string: content: forbid headers: content-type: text/plain custom-stuff: statusCode: 500

outbounds:

acl: file: /etc/hysteria/server.acl geoip: /etc/hysteria/geoip.dat geosite: /etc/hysteria/geosite.dat geoUpdateInterval: 0

quic: initStreamReceiveWindow: 8388608 maxStreamReceiveWindow: 8388608 initConnReceiveWindow: 20971520 maxConnReceiveWindow: 20971520 maxIdleTimeout: 30s maxIncomingStreams: 1024 disablePathMTUDiscovery: false

ignoreClientBandwidth: false

disableUDP: false

udpIdleTimeout: 60s

right0808 commented 5 months ago

@haruue cat server.acl reject(geoip:cn) direct(all)

haruue commented 5 months ago

是的,启动是很快的。但是初次建立连接慢。一旦能建立连接后就没有问题了。

我这边确认一下你遇到的是不是下面这种情况

  1. 服务端正常运行, 客户端正常连接和使用中
  2. 在这种情况下重启服务端
  3. 让客户端继续运行, 则需要等待几秒到十几秒才能成功发起新的代理请求
right0808 commented 5 months ago

@haruue 是的。就是这样情况。 换debian,或者 redhat系,都一样,和OS 没有关系。

haruue commented 5 months ago

那么这个问题是已知的, 和上面 @TrayBer 提到的属于同一个问题。 真正的原因是 QUIC 不会像 TCP 协议那样, 对状态无效的连接回应 RST 强制客户端重新连接。 因此客户端只能等待超时重试, 或者手动重启客户端来触发立即重连。 对于客户端程序被暂停(例如系统休眠)导致的问题, 或许可以通过在客户端里添加某些机制来解决。 对于服务端程序被重启的情况则复杂不少, 我们并没有找到一个非常可靠的机制去解决它。

TrayBer commented 5 months ago

想顺便请教一个问题,Android 系统代理客户端在电源管理是无限制设置,代理连接会一直保持吗?还是说手机锁屏即中断代理连接是 hysteria 协议才有的?

right0808 commented 5 months ago

那么这个问题是已知的, 和上面 @TrayBer 提到的属于同一个问题。 真正的原因是 QUIC 不会像 TCP 协议那样, 对状态无效的连接回应 RST 强制客户端重新连接。 因此客户端只能等待超时重试, 或者手动重启客户端来触发立即重连。 对于客户端程序被暂停(例如系统休眠)导致的问题, 或许可以通过在客户端里添加某些机制来解决。 对于服务端程序被重启的情况则复杂不少, 我们并没有找到一个非常可靠的机制去解决它。

好的,谢谢。了解了。 这种问题影响不大。服务也不是需要经常重启的。