加速器的加速原理:TCP、UDP与代理的分工

list 文章目录

有一种说法流传很广:加速器通过“更快的线路”来减少时延。

这句话没说错,却把真正值得琢磨的部分盖住了。物理线路上信号的传播速度被光速锁死,任何设备都越话要说回来这条线。那加速器到底改变了什么?答案不在传输层,而在协议层。

加速器的原理,说白了是改写了整程通信的协议行为:报文在物理链路上的传输途径和没加速时不一样——不是传得更快,而是传得更“有效”。而“有效”这个词必须拆开来看,由于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 可能已经选出了足够好的路由,加速器的骨干网并无额外收益。

连上之后不必再管它。狗急加速器持续比较 80+ 条专线的往返时延与丢包情况,随时切换到更稳的一条,重连过程在后台完成。

节点位置是这个系统中最关键的变量。如果用户与加速节点之间的路径本身就经过一个拥堵的运营商出口,那么把流量交给加速节点并不能解决第一公里的问题。类似地,若目标服务器托管在与加速器骨干网没有直连的机房,最后一公里仍然暴露在公共互联网的波动里。

在工程实践中一般会看到,提速成效对“中部通路”的调优最为看得出来,而对第一公里和最后一公里的控制力较弱。若用户的本地网络或目标服务端主机的接入网络是瓶颈,加速器能做的事情非常有限。

判断一个加速服务是否适用于特定场景,最直接的途径不是看宣传的接入点数量,而是测算你的传输量实际经过了哪些网络边界。接入点数量多意味着选择多,但不意味着自行选择了最优通路.

bash
# 通过加速器访问目标,观察通路变化
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 调用),加速器只能压缩每次交互的传输延迟,无法减少交互次数。

理解加速器的边界,比理解它的功能更重要。它并非让网络变快的魔法,而是在特定约束下,通过协议中继与路径选择来改变数据流动方式的工程手段。先确认边界,才能判断它是否适合你的问题——而不是反过来,用你的问题去验证它的功能。

作者

狗急加速器技术团队

原理之外,更该看落地方式

节点多不等于好用,关键是谁在替你选。狗急加速器实时探测各条专线的拥挤程度,把最畅通的一条分配给当前会话,线路波动时自动改道,画面不会中断。

代理、转发、加密,这些词听起来复杂,落到使用者身上只关心三件事:能不能连上、定不定、会不会拖慢网速。文章里拆解的每一层,最终都是为这三件事服务的。

狗急加速器把这些环节打包进了客户端:资源调度、线路选择、加密传输都在后台完成,前台留给用户的是一个连接按钮。理解原理有助于判断工具是否靠谱,但不该变成使用门槛。

一次完整连接里发生了什么

把你点下连接按钮之后的过程串起来看:客户端先做一轮资源质量探测,挑出候选线路;接着与目标节点完成握手与密钥协商;你的数据被加密后送入隧道;跨境段由专线承载;到了出口节点再解密还原,发往真正的目标。

这条链上任何一环慢,整体都会被拖慢。所以当用户反馈速度不理想时,我们会按 客户端—接入—专线—出口 的顺序逐段确认,而不是笼统地让你重启。

理解这条路径还有一个好处:你能大致判断出问题出在哪家公司负责的那一段,沟通起来更高效。