优化数据传输速度 | AI生成和翻译
把它想象成一条数据供应链:
== 旧的 SSH 路径 ==
git (工厂)
↓ 产生字节流
ssh (运输公司)
↓ 包裹进 SSH 加密
ncat (中转仓库)
↓ 接收、拆包、重新打包
SOCKS5 (报关行)
↓ 协议协商
mihomo (货运代理)
↓ 路由到隧道
Hysteria2 (集装箱船)
↓ 跨越大洋
DMIT LA (港口)
↓
GitHub (目的地)
每一站都会增加成本。ncat 处在中间,除了从一个套接字接收字节再写入另一个套接字之外,什么有用的事都不做——它就是一个只会重新打包箱子的仓库。
== 新的 HTTPS 路径 ==
git (工厂)
↓ 产生字节流,包裹进 TLS
mihomo (货运代理)
↓ 打开隧道,然后退到一边
Hysteria2 (集装箱船)
↓ 跨越大洋
DMIT LA (港口)
↓
GitHub (目的地)
mihomo 收到 HTTP CONNECT 请求,建立到 GitHub 的 TCP 连接,回复“200 OK,请继续”,然后数据就直接流过。就像一个货运代理只负责打开大门,让卡车直接开过去。
== 额外跳数的三种成本 ==
-
系统调用开销。ncat 使用
select()+read()+write()循环,缓冲区大小为 8KB。每个数据块:内核从套接字 A 拷贝数据到用户空间(ncat),然后内核再拷贝到套接字 B。每个数据块都要经过两次内核到用户空间的拷贝。而用 mihomo 的 HTTP 代理,数据在内核空间中停留时间更长——拷贝更少。 -
进程调度。ncat 是一个独立进程。操作系统需要在 ssh、ncat 和 mihomo 之间进行上下文切换。每次切换:保存寄存器、刷新 TLB、切换页表、恢复寄存器。在高吞吐量下,这种切换每秒发生成千上万次。HTTP 路径上竞争 CPU 时间的进程更少。
-
TCP 拥塞控制。SSH 的 TCP 栈在努力填满它的发送窗口。SOCKS5 的 TCP 栈也在努力填满它的发送窗口。两者相互独立——当其中一个检测到丢包时,它会退避,但另一个不知道,继续发送,导致更多丢包。就像两个司机想并入同一条车道却看不到对方。HTTP 路径只有一个端到端的 TCP 流——一个司机,一条车道,没有协调问题。
== 初创公司类比 ==
大公司(SSH 路径): 工程师 → 团队主管 → 总监 → 副总裁 → CTO → 副总裁 → 总监 → 团队主管 → 工程师
每个人读取消息,理解它,用自己的话重写,再传递下去。信息退化,延迟累积。
初创公司(HTTPS 路径): 工程师 → 工程师
直接沟通。相同语言。没有翻译损耗。
协议栈越“扁平”,层与层之间的翻译越少,信息流动就越快。这就是为什么移除 ncat(一个只复制字节的中继)和 SOCKS5 层(一个额外的协议协商)能带来如此巨大的差异。