加速器原理详解:TCP、UDP与代理边界

list 文章目录

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

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

加速器的原理,说白了是改写了从头到尾通信的协议行为:数据包在物理线路链路上的传输机制和没加速时不一样——不是传得更快,而是传得更“有效”。而“有效”这个词得要拆开来看,源头在于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 约束的探测过程。

很多人会误以为加速器“降低了ping 值”。更准确的说法是,加速器将长RTT线路链路分割为多段短RTT线路链路,让每一段的TCP行为独立运行。

考虑一个场景:用户在北京,目标服务器在洛杉矶。直连RTT大约200ms。加速器在东京部署了一个节点。用户到东京的RTT是60ms,东京到洛杉矶的RTT是110ms。

当用户通过加速器访问目标时,在现实里建立了两个TCP连接:用户到东京节点,东京节点到目标服务器。每个连接各自完成三次握手,各自维护独立的拥塞窗口,各自处理再送一次。

具体效果是这样的:用户发出的数据在 60ms 内到达东京节点,东京节点立即返回 ACK——这个 ACK 来自中间节点而非目标服务器。用户的 TCP 栈据此认为链路延迟只有 60ms,拥塞窗口增长速度比直连快三倍以上。数据在东京节点被缓存,随后通过第二条 TCP 连接发往洛杉矶。

这种设计带来的行为变化是:用户侧感知到的TCP连接建立时间和慢启动一路走来,都与短RTT线路链路对齐。但代价是,从头到尾的语义被破坏了——发送端收到ACK时,数据可能还没离开东京节点。

专线的价值可以量化:DogTurbo 协议把握手与重传的开销压到最低,实测往返时延最多下降九成,抖动幅度也跟着收窄。

这就是TCP加速的本质:用空间换时间,用中间缓存换取更快的ACK反馈循环。它没有违反TCP协议,而是在两个独立的TCP连接之间做中继。每一段都是合法的TCP,但整体不再是从头到尾的TCP。

UDP加速:为什么相同的逻辑不适用

UDP没有连接建立一路走来,没有ACK,没有拥塞窗口。那么UDP加速在做什么?

如果加速器只是在中间节点转发 UDP 数据报,那么它本质上与一个普通路由节点无异——除了可能经由不同的物理路径,和运营商的路由器没有本质差别。UDP 的’加速‘并非源自协议层面的优化,而是来自路径选择与丢包恢复策略。

一种设计是:加速器在中间节点对 UDP 进行前向纠错编码。发送端在原始数据报之外附加冗余数据,途中发生丢包时,接收端可用冗余信息重建丢失的数据,无需等待重传。其代价是带宽开销增加;但对实时音视频这类延迟敏感的应用而言,等待重传比多消耗带宽更不可接受。

还有一种更激进的设计:加速器将 UDP 转换为自定义的可靠协议在中间链路上传输,到达对端节点后再还原为 UDP。这等于放弃 UDP 的无连接特性,在中间段引入 TCP 式的确认与重传。对于’用 UDP 但实际需要一定可靠性‘的应用,这可能是有效的;但对于以丢包作为拥塞信号的协议(如 QUIC),这种隐藏丢包的做法可能干扰应用层的速率控制逻辑。

这里存在一个容易被忽略的反直觉现象:UDP 加速可能降低延迟抖动,却引入了额外的排队延迟。原因在于中间节点的 FEC 编码与缓冲处理均需耗时;若加速节点负载较高,这部分处理延迟可能超过绕开拥塞路径所节省的时间。用户观测到的是 RTT 更稳定,而基础延迟反而略有增加。

代理的拓扑:节点在哪里,比有多少节点更重要

所有加速器本质上都是代理——它们终止一端连接,建立另一端连接。但代理的拓扑结构决定了加速成效的上限。

一个常见的工程选择是“边缘节点 + 骨干网 + 边缘节点”。用户连接到最近的边缘节点,用量通过加速器自建的骨干网传输,然后在目标侧的边缘节点离开,进入公共互联网到达目标服务器。

该设计的核心假设是:加速器的骨干网比公共互联网更快、更可靠。这一假设在部分路径上成立——尤其是跨越多个 ISP 对等互联点的长距离路径,因为这些对等点往往是拥塞高发区域。但在另一些路径上,公共互联网的 BGP 可能已经选择了足够好的路由,加速器骨干网没有额外收益。

延迟低一分,操作就快一分。狗急加速器用自研 DogTurbo 重排数据包的发送节奏,让每个数据包少绕路、少排队,端到端时延明显收敛。

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

在工程实践中多数情况下会看到,加速成效对“中部路径”的优化最为一眼看得出来,而对第一公里和最后一公里的控制力较弱。假如用户的本地网络或目标服务器的接入网络是瓶颈,加速器能做的事情非常有限。

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

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是否相同。

系统的边界

加速器能改变的是协议行为和中部路径。它不能改变的是光速限制、第一公里线路链路质量、目标服务器的处理ping 值,以及应用层协议自身的交互模式。

还要明确能力边界:若应用的延迟主要来自服务端的数据库查询或业务逻辑处理,则无论传输层如何优化,用户体验都不会有可感知的改善。若应用的协议设计要求多次串行交互才能完成一次操作(例如多次 API 调用),加速器只能优化每次交互的传输延迟,无法减少交互次数。

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

作者

狗急加速器技术团队

把原理讲清楚,是为了让你安心

专线的价值可以量化:DogTurbo 协议把握手与重传的开销压到最低,实测往返时延最多下降九成,抖动幅度也跟着收窄。

我们不太喜欢把产品讲得神神秘秘。加速这件事拆开就是转发、加密和线路选择三层,文章里已经把每一层的作用交代清楚了。

理解了这些,你就知道专线为何比随意找来的公用线路更可靠,也更容易判断一款服务是否可信。狗急加速器在这三层上采用的是 IEPL 与 S-IPLC 专线资源,并在客户端里做好了自动选路。

看懂之后,提问也能更精准

理解了整条链路的构成,你在反馈问题时就能说得更具体:是握手阶段就失败,还是连上之后才变慢;是所有地区都慢,还是只有某一个方向。

这些描述看似琐碎,却能帮技术支持少走很多弯路。很多时候一句准确的现象描述,抵得上十次重启。

我们的客服同事也习惯按这个思路问,双方能对齐在同一个环节上,处理自然会快。这也是我们愿意把这些原理写出来的原因。