跳转至

Hysteria 是多倍发包吗?

Hysteria 自发布以来一直在一些圈子被冠以 "暴力"、"多倍发包"、"内卷"、"自私"、"不道德" 的名号。本文档旨在通过提供对 Hysteria 工作原理的进一步解释,澄清这些误解,让用户自己做出基于可靠信息的判断。

首先回答最容易回答的问题:

Q: Hysteria 是多倍发包吗?

A: 不是。Hysteria 不会在任何情况下主动对一份数据进行多次发送,只有在检测到丢包时才会对丢失的部分进行重传(丢包重传是任何可靠协议都必须有的)。而检测丢包和重传的策略和原版 QUIC 完全一致,QUIC 的策略本身也源自 TCP 没有太大区别。

在丢包率低的情况下,Hysteria 传输一份数据所消耗的流量和数据本身大小没有太大差异,并且能跑满带宽。假如是多倍发包,即使只多一倍,流量消耗也会是原来的两倍,并且最大有效传输速度只是线路的一半。因此所谓多倍发包是一个非常容易证伪的错误说法。

Q: 丢包高的情况呢?我该怎么估算会消耗多少流量?

假设有 \(10MB\) 的数据需要传输,且丢包率为恒定的 \(10\%\),即 \(0.1\)。当首次传输 \(10MB\) 的数据时,会有 \(1MB\) 的数据丢失,需要对丢失的 \(1MB\) 数据进行重传。但重传的这 \(1MB\) 数据也会丢失 \(10\%\),即 \(0.1MB\)

\[ \text{Total Data} = 10MB + 1MB + 0.1MB + 0.01MB + \ldots \]

等比级数公式代入 \(a = 10MB\)\(r = 0.1\),得到:

\[ S = \frac{10MB}{1 - 0.1} = \frac{10MB}{0.9} \approx 11.11MB \]

所以 \(10\%\) 的丢包率,任何可靠协议需要的流量至少是 \(11.11MB\)。注意这个计算是一个理论估计,假设每次丢包都能被立即检测和重新发送。实际网络环境的丢包率通常是不稳定的,延迟也会波动,实际消耗的流量会更多一些。

根据上述计算,确实存在需要双倍甚至多倍发包的情况。当丢包率为 \(50\%\) 的情况下,

\[ S = \frac{10MB}{1 - 0.5} = \frac{10MB}{0.5} = 20MB \]

但这是任何可靠传输协议都需要的理论最低流量,Hysteria 并不是例外。

Q: Hysteria 暴力吗?内卷吗?道德吗?

首先这些都是非常主观,根本没有明确定义的词,因此没有客观答案。Hysteria 的 Brutal 拥塞控制 的确有别于传统的拥塞控制,需要由用户设定一个想要达到的目标速度,在丢包时并不会降低速度,而是通过计算的丢包率来提升速度进行补偿。

计算机网络中有 Best-effort delivery "尽力而为" 这个概念。用来翻墙的中国用户一般所说的 "线路差",通常指的是骨干网/国际出口设备这一跳带宽不足导致的高延迟、高丢包现象。

到了骨干网这个层面,并不存在针对单个用户的 QoS(存在为各种专线预留的带宽,但是剩下的都是 "尽力而为")。假设这个设备一秒钟只能处理 10 个包,而目前每秒来 20 个包,可以理解成是随机选择 10 个转发而丢弃剩下的 10 个,不会考虑这 20 个包中有多少来自哪个用户这些信息。对于使用基于丢包率的传统拥塞控制的协议,由于发生丢包就会降低速度(发包变慢),而骨干网是一个带宽远高于用户带宽的设备,并不会因为一个用户一个连接慢下来而变得不拥塞,减少发包只会使得你的包占比更少被选中的几率更低,进入一个恶性循环。这也是在中国和境外服务器之间 TCP 连接 (尤其在有 BBR 之前) 慢的难以忍受的原因。

而如果坚持发包,即使其他流量并不退让,你的包因为占比多,被选中的概率也会提升。这样 "抢占" 带宽是否 "道德" 是一个主观问题,但客观的根本原因是运营商设备带宽不足急需扩容。运营商不应指望用户去 "体谅" 骨干网容量不够 - 运营商和用户签约了一个速率,用户并没有去破解这个限速,只是在使用运营商承诺给自己的带宽,这是合理的行为。

Q: 我还是觉得暴力,有没有温柔一点的办法?

带宽行为详解 所述,如果 Hysteria 客户端不设置带宽数值,或者设置为 0,就不会使用 Brutal 而是用 BBR。并且考虑到 "机场主" 的需要,服务端还增加了 ignoreClientBandwidth 选项,开启后无论客户端设置如何都永远使用 BBR。