tcp_connect 在 TCPResponse 上阻塞 (没有快速打开) → 修复了每个连接的 ~3s 延迟
□ 环境
- 箱:歇斯底里2 01.6
- 服务器:唱箱(歇斯底里2接入)
□ 症状
在使用这个箱子作为客户端时,每一个新建立的代理连接都有一个 ** 固定为~3秒** 在第一次答复之前延迟。 官方Go客户端 (apernet/hysteria)对"同*"服务器只取数十毫秒.
A/B比较(服务器相同,目标相同):
QQ 客户端 QQ 首个响应(单 Con) QQ |-|-|-. 官方Go客户端 这个箱子 ~3.1s ~~
20个串行连接:与这个箱子相接的62s,在下面固定后1.7s.
因此它与quinn, 速率限制, MTU, 或拥堵控制无关—— 它纯粹是一个 连接设置命令问题 。
□ 根源
`tcp connection' ** 同步阅读和剖析服务器的三年期全面政策审查 返回溪流**.
但是,在歇斯底里2的设计中,许多服务器(例如唱箱)发送三年期全面政策审查 *lazily *——他们等待上游目标连接建立,或直到 他们收到客户的第一个字节,然后回答三年期全面政策审查。
这就形成了循环等待:
- 客户端:除非有三年期全面政策审查,否则不会回流。 写入其第一个字节;
- 服务器:在收到第一个字节(或 上游已就绪)。
双方互相等待,直到服务器的3s倒计时中断 僵持状态——因此,每次连接的首次答复时间是固定的3.1. 任何打电话者 “ 连接先成功, 然后发送请求” 类型的协议( 非常常见) 触发这个可靠。
□官方客户如何避免:快开.
官方 Go 客户端使用 ** fast- open ** : 'tcp connect' 返回流 并且不**等待三年期全面政策审查;实际三年期全面政策审查是 在溪上脱去懒惰的第一读。 让呼叫者写出第一个字节 马上打破循环等待。
□ 建议
添加快速打开选项到“ tcp connection” (或使其成为默认行为): 后 在握手时发送 TCP 请求, 立即返回流并推迟 三年期全面政策审查在第一次宣读前进行分析。
随着这一改变在当地应用,单连接第一次反应从3.13s下降 改为0.065s.
内容来源: i18n-site/rust