有一种说法流传很广:加速器通过“更快的线路”来减少时延。
这句话没说错,却把真正值得琢磨的部分盖住了。物理线路上信号的传播速度被光速锁死,任何设备都越话要说回来这条线。那加速器到底改变了什么?答案不在传输层,而在协议层。
加速器的原理,说白了是改写了整程通信的协议行为:报文在物理链路上的传输途径和没加速时不一样——不是传得更快,而是传得更“有效”。而“有效”这个词必须拆开来看,由于TCP和UDP对它的定义完全不同。
TCP加速:确认不是确认
TCP的设计约束是理解一切加速行为的起点。
TCP 开始传数据之前,必须先完成 SYN、SYN-ACK、ACK 这三次交互。放在 RTT 为 200ms 的链路上,光建连就要至少 200ms:SYN 单向出去一次,SYN-ACK 反向回来一次,第三个 ACK 虽可携带数据,但连接建立已经消耗掉一个完整的 RTT。这就是所谓的’冷启动延迟‘。
紧接着,TCP 的拥塞控制从一个较小的窗口起步,每收到一个 ACK 就把窗口放大一点。高延迟链路上,窗口增长的节奏被 ACK 返回的速度卡住:RTT 若为 200ms,窗口每 200ms 才能增长一次。结果是,即便链路带宽充足,TCP 也需要若干个 RTT 才能’探‘到可用带宽并把它填满。因此慢启动并不真的慢,它只是被 RTT 约束的探测过程。
很多人会误以为加速器“降低了时延”。更准确的说法是,加速器将长RTT链路分割为多段短RTT链路,让每一段的TCP行为独立运行。
考虑一个场景:用户在北京,目标服务端主机在洛杉矶。直连RTT大约200ms。加速器在东京部署了一个接入点。用户到东京的RTT是60ms,东京到洛杉矶的RTT是110ms。
当用户通过加速器访问目标时,实际跑起来建立了两个TCP接入:用户到东京接入点,东京接入点到目标服务端主机。每个接入各自完成三次握手,各自维护独立的拥堵窗口,各自处理补发。
这意味着什么?用户的数据在 60ms 内抵达东京节点,东京节点立即回 ACK——这个 ACK 来自中间节点而非目标服务器。用户的 TCP 栈据此判断链路延迟只有 60ms,拥塞窗口的增长速度比直连快了三倍以上。数据先缓存在东京节点,再通过第二条 TCP 连接发往洛杉矶。
这种设计带来的行为变化是:用户侧感知到的TCP接入建立时间和慢启动流程,都与短RTT链路对齐。但代价是,整程的语义被破坏了——发出端收到ACK时,数据有可能还没离开东京接入点。
这就是TCP加速的本质:用空间换时间,用中间缓存换取更快的ACK反馈循环。它没有违反TCP协议,而是在两个独立的TCP接入之间做中继。每一段都是合法的TCP,但整体不再是整程的TCP。
UDP加速:为什么相同的逻辑不适用
UDP没有接入建立流程,没有ACK,没有拥堵窗口。那么UDP加速在做什么?
若加速器仅仅是在中间节点转发 UDP 数据报,它实际上就只是一个普通的路由节点——除了可能经由不同的物理路径,与运营商的路由器没有本质区别。UDP 的’加速‘并不来自协议层面的优化,而是来自路径选择与丢包恢复策略。
其中一种设计是:加速器在中间节点对 UDP 做前向纠错编码。发送端在原始数据报之外附加上冗余数据,途中一旦丢包,接收端即可用冗余信息重建丢失内容,无需等待重传。代价是带宽开销上升;但对实时音视频这类延迟敏感的应用,等待重传比多消耗带宽更不可接受。
另一种设计更激进:加速器把 UDP 转成自定义的可靠协议在中间链路上传输,到达对端节点后再还原为 UDP。这等于放弃了 UDP 的无连接特性,在中间段引入类似 TCP 的确认与重传。对’用 UDP 但实际需要一定可靠性‘的应用,这可能有效;但对依赖丢包作为拥塞信号的协议(例如 QUIC),这种隐藏丢包的做法可能干扰应用层的速率控制逻辑。
一个容易被忽略的反直觉现象是:UDP 加速可能让抖动下降,却同时引入额外的排队延迟。这是因为中间节点的 FEC 编码与缓冲处理都需要时间;当加速节点负载偏高时,这段处理延迟可能超过绕开拥塞所节省的时间。结果是用户看到 RTT 更稳定,基础延迟却略有上升。
代理的拓扑:接入点在哪里,比有多少接入点更重要
所有加速器本质上都是代理——它们终止一端接入,建立另一端接入。但代理的拓扑结构决定了提速成效的上限。
一个常见的工程选择是“边缘接入点 + 骨干网 + 边缘接入点”。用户接入到最近的边缘接入点,传输量通过加速器自建的骨干网传输,然后在目标侧的边缘接入点离开,进入公共互联网到达目标服务端主机。
这个设计的核心假设是:加速器的骨干网比公共互联网更快、更可靠。该假设在某些路径上成立——特别是跨越多个 ISP 对等互联点的长距离路径,因为这些对等点往往是拥塞高发区域。但在另一些路径上,公网的 BGP 可能已经选出了足够好的路由,加速器的骨干网并无额外收益。
节点位置是这个系统中最关键的变量。如果用户与加速节点之间的路径本身就经过一个拥堵的运营商出口,那么把流量交给加速节点并不能解决第一公里的问题。类似地,若目标服务器托管在与加速器骨干网没有直连的机房,最后一公里仍然暴露在公共互联网的波动里。
在工程实践中一般会看到,提速成效对“中部通路”的调优最为看得出来,而对第一公里和最后一公里的控制力较弱。若用户的本地网络或目标服务端主机的接入网络是瓶颈,加速器能做的事情非常有限。
判断一个加速服务是否适用于特定场景,最直接的途径不是看宣传的接入点数量,而是测算你的传输量实际经过了哪些网络边界。接入点数量多意味着选择多,但不意味着自行选择了最优通路.
# 通过加速器访问目标,观察通路变化 mtr -r -c 10 目标IP # 对比直连通路 mtr -r -c 10 --address 本地IP 目标IP
若你发现加速后的通路确实绕开了某个经常出现拥堵的AS边界,那么加速有效。若加速后的通路在到达加速接入点之前已经经过了那个边界,那么加速器没有帮上忙。
误判:加速 vs. 路由变化
还有一种情况容易被误判为加速器的效果:本地ISP的路由选路策略恰好发生了变更。
假设某个时段用户观察到延迟下降,而这一变化恰好发生在启用加速工具之后,直觉自然会把它归因于加速工具。可同一时段内,运营商也可能因链路故障或成本调整而切换了出口路由,使路径绕开了常年拥堵的点。若没有在切换前后同时测量直连路径与加速路径,这两种可能就无法区分。
更隐蔽的情况是:加速工具使用的 DNS 解析返回了不同的目标 IP。很多大型服务使用 CDN,不同 IP 对应不同的接入点。若加速器的 DNS 解析返回一个离用户更近、或负载更低的 CDN 节点,延迟下降可能完全来自 DNS 层面的变化,而非加速器骨干网的贡献。这就是’看似是加速器,其实是 DNS‘的变体。
要区分这些情况,必须保持一个不变的参照系:固定目标IP,而不是目标域名。用IP进行直连测试和加速测试的对比,才能排除DNS变化的干扰。用域名测试时,你不知道每一次解析返回的IP是否相同。
系统的边界
加速器能改变的是协议行为和中部通路。它不能改变的是光速限制、第一公里链路质量、目标服务端主机的处理时延,以及应用层协议自身的交互模式。
再来看它的适用边界:如果应用的延迟主要源于服务端的数据库查询或业务逻辑处理,那么无论传输层如何优化,用户体验都不会有可感知的改善。如果应用的协议设计要求多次串行交互才能完成一次操作(例如多次 API 调用),加速器只能压缩每次交互的传输延迟,无法减少交互次数。
理解加速器的边界,比理解它的功能更重要。它并非让网络变快的魔法,而是在特定约束下,通过协议中继与路径选择来改变数据流动方式的工程手段。先确认边界,才能判断它是否适合你的问题——而不是反过来,用你的问题去验证它的功能。
