跳到主要内容

Windows 为什么只有全局模式:和安卓端的差别

两端的差别,一句话

安卓端可以让国内网站和应用直连、其余走隧道;Windows 端目前做不到,整机流量统一走隧道。

这不是桌面端少做了一个开关,而是两个系统在「能不能把某个进程排除在隧道之外」这件事上的能力不一样。下面说清楚为什么,以及这条限制在实际使用中会怎样。

安卓端为什么可以

安卓在建立系统级隧道时,允许应用声明「把我自己排除在这条隧道之外」。客户端启动隧道的第一件事就是把自己的进程加进排除名单,于是它自己发出的网络请求走的是手机原本的网络,不进隧道。

这一步是分流能力的地基。有了它,客户端就可以对每个目标做判断:这是国内域名,交给系统直连;这是境外目标,送进隧道。因为它自己的请求本来就在隧道外面,直连出去的包不会再回到自己手上。

同样的机制也支撑了安卓端的分应用代理——排除模式(选中的应用不走隧道)和仅代理模式(只有选中的应用走隧道)都建立在「能按进程区分」这个前提上。

Windows 端卡在哪里

Windows 没有对应的按应用排除能力。

桌面端连接时会创建一张虚拟网卡,并给它下一条默认路由(0.0.0.0/0)。据 Microsoft 官方文档对 Windows 路由选择的说明,当多条路由都能到达同一目标时,系统先比较前缀长度,前缀相同则比较跃点数(metric),数值更低的胜出。桌面端给这条默认路由设的跃点数是 5,而一张普通物理网卡的默认路由通常在 25 到 45 之间——差距是刻意留出来的。于是连接之后,机器上任何进程发出的、没有更精确路由匹配的流量,都会走虚拟网卡,包括客户端自己发出的那些。

这就是回环的成因。假设桌面端也做国内直连:客户端判断某个国内域名应该直连,于是把请求交给系统;系统查路由表,发现虚拟网卡跃点数最低,把这个「直连」请求送进了隧道;隧道另一端把它交回客户端处理,客户端再次判断这是国内域名、应该直连……同一个请求在这个圈里反复循环,既到不了目的地,还会把连接数迅速堆高。

应用内的开关对此有明确说明:Windows 暂不支持,因为系统无法把本应用自身的流量排除在隧道之外,让国内站点直连会绕回隧道形成回环,所以当前全部流量都走隧道。那句提示就是上面这件事的浓缩版。

例外只有两类精确路由

「没有更精确路由匹配」这个前提有两个口子,但它们比一般人想的窄得多:

一是服务器地址本身,这一条是常设的。客户端为它连接的那台服务器单独下一条精确到单个地址的路由,指向物理网卡。否则隧道自己的载体流量也会被虚拟网卡吞掉——那是另一种形式的回环,而且会让隧道根本建不起来。

二是更新包的下载地址,而且只在下载期间存在。客户端要下载更新时,会临时为下载镜像的地址加上同类的精确路由,下载结束(无论成功还是失败)立刻撤掉。它的目的不是「让更新通道在隧道异常时仍然可用」——检查更新的那次请求并不在例外之内,照样走隧道——而是让客户端自己的更新流量留在隧道外面,对应安卓端把本应用排除在隧道之外的那个声明。

这两类都是精确到单个地址的路由,覆盖不了「所有国内网站」——国内网站的地址段数量级完全不同,逐条下路由既维护不了,也会让路由表膨胀到影响系统。

实际使用中会怎样

访问国内站点会绕一圈。 连接之后打开国内网站,请求会先出境到服务器、再回到国内目标,然后原路返回。功能上没问题,但比直连多走一个来回,页面打开会慢一些,尤其是那些需要加载很多小资源的页面。

流量会算在额度里。 因为国内流量也经过了隧道,它同样计入用量。安卓端开了智能分流之后国内流量不入隧道、不计额度,桌面端没有这个节省。

几个不需要隧道的场景值得手动断开。 比如在国内网盘上传大文件、看国内视频、打国内服务器的游戏——这些场景下连着隧道只有坏处。桌面端断开和重连都很快,用完再连回来通常比忍受绕路更划算。

可以怎么绕开

方案一:需要时才连。 最简单也最有效。桌面端的连接建立很快,把它当成一个按需开关而不是常驻服务,绝大多数「国内变慢」的抱怨就消失了。

方案二:分工。 需要长时间保持境外连接的工作放在一台设备上,日常国内使用放在另一台。注意同一账号的设备位是有限的,具体几台见 这一篇

方案三:安卓端处理需要分流的场景。 如果你的使用场景确实需要「国内直连、境外走隧道」同时成立,安卓端现在就能做到,桌面端暂时不能。

⚠️ 不建议自己在系统里改路由或者调跃点数去模拟分流。 手工加的路由不会随连接状态变化,断开之后它们还留在表里,会造成断开后某些目标反而不通;而调低物理网卡的跃点数则可能让隧道的载体流量选错出口,直接把连接搞断。

立即下载

常见问题

桌面端会不会以后支持智能分流? 这是实现层面的限制而不是设计取舍,方向上是要解决的。但它需要的不是加一个开关,而是让客户端自己的流量在 Windows 上可靠地留在隧道外面,这一步在当前的系统能力下没有稳妥做法。

为什么安卓能做到,Windows 不行,两个不都是系统级隧道吗? 隧道本身两边都有,差别在「能不能按进程排除」。安卓在建立隧道时提供了这个声明,Windows 没有对应机制,只能靠精确路由逐个地址放行,而这个办法覆盖不了整个国内地址段。

连着隧道打开国内网站会不会有风险? 不涉及安全问题,只是路径变长。请求出境再回来,功能正常,速度会慢一些。

国内流量也算进我的额度吗? 桌面端会算,因为它同样经过了隧道。安卓端开启智能分流之后,被判定为国内的流量不进隧道,也就不计入额度。

能不能只让浏览器走隧道、其他软件不走? 安卓端的仅代理模式可以做到按应用选择,桌面端目前不行——按应用区分依赖的正是 Windows 缺少的那个能力。

我自己在 Windows 里加一条国内网段的路由行不行? 技术上能加,但不建议。手工路由不随连接状态变化,断开之后仍然留在路由表里,会导致断开后某些目标不通;而且国内地址段数量太大,逐条维护不现实。

断开之后网络恢复正常需要多久? 桌面端断开时会把它接管的默认路由交还给物理网卡,通常是立即生效。如果断开后仍然上不了网,先确认客户端进程是否已经完全退出。

为什么服务器地址和更新地址是例外? 因为它们必须走物理网卡。隧道自己的载体流量如果被虚拟网卡吞掉,隧道就建不起来,所以服务器地址是一条常设的精确路由。更新下载地址是另一回事:它只在下载更新的那段时间存在,结束就撤掉,目的是让客户端自己的更新流量留在隧道外面,而不是给你留一条「隧道坏了还能更新」的通道——检查更新的请求本身仍然走隧道。

立即下载

免费起步,换设备重新登录同一账号即可,不必再注册。