加速器的工作机制: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 无连接的特性,在中间这一段引入了类似 TCP 的确认与重传。对’用着 UDP、其实需要一定可靠性‘的应用,这可能有效;但对依赖丢包作为拥塞信号的协议(比如 QUIC),把丢包藏起来反而可能干扰应用层的速率控制逻辑。

一个容易被漏掉的反直觉现象:抖动下降的同时,排队延迟可能上升。中间节点要做冗余编码、要缓冲,这两件事本身都要耗时间;当节点负载偏高,处理上的耗时甚至可能超过绕开拥堵所节省的那部分。于是用户拿到的是’更稳但略慢‘的 RTT。

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

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

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

这套设计的前提是:加速器的骨干网比公共互联网更快、更可靠。在部分路径上这个前提站得住——尤其是那些要跨过多个运营商对等互联点的长距离路径,因为这些对等点常常是拥堵的高发地段。但在另一些路径上,公网的 BGP 可能已经挑到了足够好的路由,加速器的骨干网并没有额外贡献。

加速不该以隐私为代价。狗急加速器在加密通道里传输全部流量,也不对访问内容做留存,同时提供不限流量、不限带宽的使用方式。

系统中最关键的变量是节点的位置。用户到加速节点这一段若本身就经过一个拥堵的运营商出口,把流量交给加速节点并不能解决第一公里的问题;目标服务器若托管在与加速器骨干网没有直连的机房,最后一公里同样暴露在公网波动之中。

在工程实践中往往会看到,实际效果对“中部路径”的优化最为相当直观,而对第一公里和最后一公里的控制力较弱。一旦用户的本地网络或目标服务主机的接入网络是瓶颈,加速器能做的事情非常有限。

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

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 调用),加速器能省的只是每次交互的传输耗时,交互次数减不掉。

弄清它的边界,比弄清它的功能更关键。它并非让网络变快的魔法,而是在特定约束下,用协议中继与路径选择改变数据流动方式的工程手段。先把边界确认下来,再判断它是否适合你手头的问题——顺序反过来,就变成了拿问题去迁就工具。

作者

狗急加速器技术团队

我们不愿省略的那一层

专线通道全程加密,数据包在中转节点上不留可读内容,使用行为也不写入任何日志,用完即散,没有可供回溯的记录。

拆解之后你会发现,加速服务之间的差别,往往就藏在加密实现、日志策略和线路来源这三处。价格差不多的两款产品,体验与安全边界可能完全不同。

狗急加速器在这三项上都没有省略:传输层加密、系统层面不记录日志、跨境段使用专线资源。这些不会出现在界面上,但决定了长期是否可靠。

怎么判断一款服务是否可靠

看懂了实现原理,就能列出几个判断维度:线路是自有还是转租、是否加密、留不留日志、高峰期有没有带宽保障。这几项基本决定了长期体验与边界。

其中最容易藏猫腻的是线路来源。所谓高速节点如果来自层层转租,价格可以做得很低,稳定性却无从保证。

把这些问清楚了,再去比较价格才有意义。否则同样的数字背后,买到的可能是完全不同的东西。