tizivpn.blog
tizivpn.blog

搜索全站文章

梯子指南 / 网络协议 专业

TCP、UDP、TLS、DNS 与代理连接的关系

按时间顺序拆解一次代理请求经过的 DNS、TCP/UDP、TLS/Reality 与内层 HTTPS,帮助你判断连接故障出在哪一层。

发布于 更新于 约 10 分钟读完 专业 原理

简短回答

代理连接是分层叠加的:客户端先决定目标域名在哪里解析,再通过 TCP 或 UDP 连接代理服务器,用 TLS、Reality 或协议自带的加密建立外层隧道,隧道里才是浏览器与网站之间原本的通信(通常本身又是一层 HTTPS)。弄清各层的先后关系,就能判断故障出在解析、连接、握手还是目标网站。

本文要点

  • 一次代理请求包含两段连接:设备到代理服务器的外层隧道,以及代理服务器到目标网站的内层连接。
  • 目标域名可能在应用本地、客户端内核或代理服务器端解析,解析位置决定是否发生 DNS 泄漏。
  • Trojan、VLESS、VMess 多运行在 TCP 之上;Hysteria2、TUIC 基于 QUIC,依赖 UDP 的可达性。
  • 系统 UTC 时间偏差会导致 TLS 证书校验失败,VMess 还要求客户端与服务器的时间误差在 90 秒以内。
  • 外层加密只保护到代理服务器为止,访问 HTTP 明文网站时,服务器到网站这一段仍是明文。
梯子指南专题封面:TCP、UDP、TLS、DNS 与代理连接的关系
★ 编辑推荐 二猫云 · 三网优化 IEPL 专线
查看实测 →
本文目录(13)

开着代理客户端打开一个网页,背后的过程比平时复杂得多:浏览器、客户端内核、代理服务器和目标网站之间,至少会出现两段连接、多次握手,还有一个经常被忽略的问题——域名到底在哪里被解析。很多看似“玄学”的故障,比如全部节点超时、显示已连接却打不开网页、DNS 泄漏检测不通过,其实都能在这条路径上找到对应的位置。

本文以“通过代理访问一个 HTTPS 网站”为例,按时间顺序把每一层拆开,说明 TCP、UDP、TLS 与 DNS 各自负责什么,以及它们与代理协议之间的关系。

全景:一次代理请求的四个阶段

假设你在规则模式下用浏览器访问 https://www.example.com,系统代理指向本地客户端。简化之后,数据会依次经历下面几个阶段:

浏览器 ──(本机回环)──▶ 代理客户端(mihomo / sing-box / Xray 等内核)
   │ ① 匹配规则,决定走代理;确定目标域名在哪里解析
   ▼
客户端 ──② TCP 或 UDP 连接──▶ 代理服务器(入口 / 落地)
   │ ③ 外层 TLS / Reality / 协议自带加密的握手
   ▼
代理服务器 ──④ 新的 TCP 连接 + 浏览器与网站之间的 TLS──▶ www.example.com

先建立一个基本概念:外层连接是设备到代理服务器之间的隧道,内层连接是浏览器与目标网站之间原本就会进行的通信。代理协议负责外层,网站的 HTTPS 负责内层,两者各管一段,互不替代。

阶段一:DNS 解析发生在哪里

DNS 的职责是把域名换成 IP 地址(基础规范见 RFC 1035)。在代理场景中,至少涉及两类域名的解析。

代理服务器自己的域名

订阅里的节点地址经常是域名而不是 IP。客户端要连接节点,必须先在本地解析这个域名,这一步使用客户端配置的 DNS 服务器——在 mihomo 中可以通过 proxy-server-nameserver 单独指定,留空时按普通的 nameserver 规则处理。如果这一步失败,表现就是节点超时,与代理服务器本身是否正常无关。

目标网站的域名

这是讨论“DNS 泄漏”时的重点。目标域名可能在三个位置被解析:

解析位置 典型情形 结果
应用或系统本地 应用先自行解析,再把 IP 交给代理;SOCKS5 未启用远程解析 查询发往本地网络的 DNS,可能泄漏
客户端内核 规则中有 GEOIP、IP-CIDR 等 IP 类规则,需要先知道 IP 才能匹配 查询发往客户端配置的 DNS 服务器
代理服务器端 客户端把域名原样交给代理(HTTP CONNECT、SOCKS5 域名请求、Fake-IP) 本地不产生该域名的明文查询

Fake-IP 模式的思路是:内核先给应用返回一个保留网段里的虚拟地址,等应用真正发起连接时,再根据虚拟地址找回原始域名,按域名匹配规则;如果结果是走代理,域名会交给服务器去解析。这样既减少了本地查询,也省去了等待真实解析的时间。

阶段二:TCP 握手连接到代理服务器

决定走代理之后,客户端会与节点的地址和端口建立连接。对于基于 TCP 的协议,这是一次标准的三次握手(SYN、SYN-ACK、ACK,定义见 RFC 9293),大约耗费一个往返时间(RTT)。

这里有两点容易被忽略:

  1. 这次握手的对象是代理服务器,而不是目标网站。 节点能完成 TCP 握手,只说明入口端口可达,不代表服务器后面的链路一切正常。
  2. TCP 保证数据可靠、有序。 发生丢包时它会重传并降低发送速率;只要前面有一个包没到,后面已经到达的数据也要等着,这就是所谓的队头阻塞。高丢包线路上 TCP 类协议速度明显下降,原因就在这里,详细分析可以阅读 网络延迟、丢包与带宽如何影响实际速度。

阶段三:外层加密与伪装——TLS 与 Reality

TCP 连通后,代理协议开始自己的握手。不同协议在这一层的做法差别很大:

  • Trojan 直接使用标准 TLS,服务器需要有效的域名与证书,客户端会校验证书。
  • VLESS + Reality:VLESS 本身不加密,由外层的 Reality 负责。服务器在握手中借用一个真实网站的 TLS 特征,因此无需为代理准备自己的证书;客户端则通过预先配置的公钥、短 ID 等参数确认对方身份。
  • VMess 与 Shadowsocks 自带加密,不依赖 TLS;VMess 还可以叠加 TLS、WebSocket 等传输方式。

TLS 1.3(RFC 8446)完成一次完整握手通常需要一个 RTT。握手开头的 ClientHello 里,SNI(服务器名称指示)一般以明文发送,这也是各类伪装方案都非常在意 SNI 取值的原因。

阶段四:内层流量——浏览器自己的 HTTPS

外层隧道建立后,客户端把“我要访问 www.example.com 的 443 端口”这一请求连同后续数据一起交给代理服务器。服务器(或最终的落地服务器)再与目标网站建立一条新的 TCP 连接,浏览器随后通过整条隧道,与网站完成它自己的 TLS 握手。

由此可以得出三个结论:

  • 访问 HTTPS 网站时,代理服务器知道你要访问的域名和端口,但看不到网页内容;
  • 访问 HTTP 明文网站时,外层加密只保护到代理服务器为止,服务器到网站这一段是明文;
  • 第一次打开一个网站需要叠加多次握手:外层 TCP、外层 TLS、服务器到网站的 TCP,以及内层 TLS。RTT 越大,“点开后要等一下”的感觉越明显——这就是高延迟节点“打开慢,下载却不一定慢”的原因。

客户端通常会复用已经建立的外层连接,或通过多路复用减少握手次数,具体效果取决于协议与配置。

UDP 与基于 QUIC 的代理协议

UDP 不建立连接,也不保证送达(RFC 768),开销小,适合 DNS 查询、语音通话和游戏这类“宁可丢一点,也不要等”的数据。QUIC(RFC 9000)在 UDP 之上实现了可靠传输、多路复用和连接迁移,并把 TLS 1.3 直接集成到握手中,HTTP/3 就运行在 QUIC 之上。

Hysteria2 与 TUIC 都是基于 QUIC 的代理协议:

  • 一条 QUIC 连接中的多个流彼此独立,一个流丢包不会卡住其他流,缓解了 TCP 的队头阻塞;
  • Hysteria2 在用户设定带宽时使用名为 Brutal 的拥塞控制,按设定速率发送,不因丢包大幅退让,未设定时则回退到 BBR 等常规算法;TUIC 更强调低握手延迟与原生 UDP 转发;
  • 代价是依赖 UDP 的可达性。部分运营商、校园网或公司网络会对 UDP 限速、降低优先级甚至阻断,这时 QUIC 类协议可能比 TCP 类更慢,甚至完全不可用。

另外,“协议基于 TCP”并不等于“不能转发 UDP”。Trojan、VLESS、VMess 都可以把 UDP 数据封装在 TCP 连接中传输,Shadowsocks 则有独立的 UDP 转发方式。玩游戏或进行语音通话时需要节点支持 UDP,选择服务前可以先确认这一点。

常见协议与传输层对照表

协议 底层传输 外层安全机制 UDP 转发方式 备注
Shadowsocks(含 2022 版) TCP / UDP 协议自带 AEAD 加密 以独立的 UDP 数据报发送 轻量,没有 TLS 外观
VMess TCP(可叠加 WebSocket、gRPC 等) 自带加密,可叠加 TLS 封装在 TCP 连接内 对系统时间敏感
VLESS + Reality TCP Reality 封装在 TCP 连接内 无需自有域名证书
Trojan TCP TLS(需要域名证书) 封装在 TLS 连接内 外观接近普通 HTTPS
Hysteria2 UDP(QUIC) QUIC 内置 TLS 1.3 原生 UDP 受 UDP 限速影响
TUIC v5 UDP(QUIC) QUIC 内置 TLS 1.3 原生 UDP 主要由 mihomo、sing-box 等内核支持
WireGuard UDP 协议自带加密 原生 UDP 属于 VPN 隧道协议

表格反映的是常见用法,具体行为会因内核版本和服务端配置而有所不同。

系统时间为什么能让所有节点“同时失效”

时间问题之所以常见,是因为它会同时影响多个层次:

  • TLS 证书校验:证书带有生效时间和到期时间。设备时钟快了或慢了很多,客户端会判定证书“尚未生效”或“已经过期”,Trojan 等依赖证书的节点会全部握手失败。
  • VMess 的时间校验:VMess 的认证信息包含时间戳,V2Ray 文档要求客户端与服务器的 UTC 时间误差保持在 90 秒以内,超出即被拒绝。
  • Reality 等方案:部分服务端也可以配置允许的最大时间差。

判断标准是 UTC 时间,而不是界面上显示的本地时间。如果时区设错了,又手动把时钟调到“看起来正确”,实际的 UTC 时间仍然是错的。最稳妥的做法是开启系统的自动时间同步。遇到所有节点同时超时,可以对照 节点全部超时的排查步骤 逐项检查。

DNS 泄漏常出现在哪些环节

DNS 泄漏指本应交给代理处理的域名查询,被发到了本地网络的 DNS 服务器。常见来源包括:

  1. IP 类规则触发本地解析:GEOIP、IP-CIDR 等规则需要 IP,域名请求走到这些规则时,内核会先进行解析。在 mihomo 中,可以给不需要解析的 IP 规则加上 no-resolve,并把常用域名规则放在前面,规则的匹配顺序见 规则模式、全局模式与直连模式的区别。
  2. 应用自行解析:通过 SOCKS5 连接代理、但没有启用远程解析的程序,会先在本地查好 IP 再连接代理。
  3. 绕过系统代理的程序:不读取系统代理设置的应用会直接使用系统 DNS,TUN 模式配合 DNS 劫持可以接管这部分流量。
  4. IPv6 路径:系统启用了 IPv6 而客户端没有正确处理时,部分查询与连接可能直接从 IPv6 出去。
  5. 浏览器内置的安全 DNS:浏览器开启 DoH 后会自行发起解析,表现可能与客户端设置不一致。

连接后可以使用 网络检测工具 中的 DNS 泄漏测试确认实际情况;配置层面的问题,可以参考 DNS 与网络配置问题专题。

用命令行观察这几层

下面的命令可以直观看到解析、连接和握手的过程(www.example.com 是保留的示例域名,7897 只是示例端口,请以客户端中的实际端口为准):

# 查看域名解析结果;第二条指定公共 DNS 服务器做对比
nslookup www.example.com
nslookup www.example.com 1.1.1.1

# 不经过代理:观察解析出的 IP、TCP 连接与 TLS 握手过程
curl -v -o /dev/null https://www.example.com

# 经过本地 HTTP 代理端口
curl -v -o /dev/null -x http://127.0.0.1:7897 https://www.example.com

# 经过 SOCKS5:socks5:// 由 curl 在本地解析,socks5h:// 把域名交给代理端解析
curl -v -o /dev/null -x socks5://127.0.0.1:7897 https://www.example.com
curl -v -o /dev/null -x socks5h://127.0.0.1:7897 https://www.example.com

观察要点:

  • 直接访问时,-v 输出会依次显示解析得到的 IP、TCP 连接成功的提示、TLS 握手过程与证书信息,具体格式因 curl 版本和所用 TLS 库而略有差异;
  • 通过 HTTP 代理时,可以看到 CONNECT www.example.com:443 这一行,说明交给代理的是域名而不是 IP;
  • socks5:// 与 socks5h:// 的差别,正好对应上文“解析位置”表格中的前后两种情形。

Windows PowerShell 中的 curl 默认是另一个命令的别名,请输入 curl.exe 调用系统自带的 curl,并把 /dev/null 换成 NUL。另外,开启 TUN 模式后,即使不加 -x,流量也会被客户端接管,测试前先确认当前状态。

按层定位常见故障

现象 最可能出问题的层 优先检查
所有节点同时超时 系统时间、节点域名解析、本地网络 自动时间同步、客户端 DNS、换一个网络测试
部分节点超时 外层 TCP / UDP 连接 节点维护公告、端口可达性、UDP 是否受限
延迟测试正常但网页打不开 规则或内层连接 系统代理是否生效、规则去向、目标网站状态
网页打开慢、下载正常 握手次数多、RTT 大 换延迟更低的节点,确认是否启用连接复用
DNS 泄漏测试不通过 解析位置 Fake-IP 设置、no-resolve、TUN 的 DNS 劫持

如果遇到的是“客户端显示已连接,但浏览器打不开网站”,可以继续阅读 Clash Verge 连接成功却无法访问的排查方法,按系统代理、规则与 DNS 的顺序逐项确认。

本文涉及术语

TCP
面向连接、保证可靠送达的传输层协议。
UDP
无连接、开销小的传输层协议。
TLS
为网络连接提供加密与身份验证的安全协议。
DNS
把域名翻译成 IP 地址的系统。
Reality
无需自有域名证书、借用真实网站 TLS 特征的传输安全方案。
Hysteria2
基于 QUIC(UDP)的高速代理协议。
Fake-IP
客户端先返回虚拟 IP、由代理端完成真实解析的 DNS 模式。
VMess
V2Ray 项目早期设计的加密传输协议。

常见问题

Q 开着代理时,网站的域名是在哪里解析的?
A 取决于客户端的 DNS 设置、规则和应用的代理方式。使用 Fake-IP,或应用通过 HTTP CONNECT、SOCKS5 把域名原样交给代理时,目标域名通常由代理服务器端解析;规则中的 GEOIP、IP-CIDR 等 IP 类规则,或应用自行解析后再连接代理,会让查询先在本地发生。可以用 DNS 泄漏检测工具确认实际情况。
Q 为什么系统时间不准会让所有节点同时失效?
A TLS 证书有生效和到期时间,设备时间偏差过大时,客户端会判定证书无效,依赖证书的节点全部握手失败;VMess 协议还会校验客户端与服务器的 UTC 时间差,官方文档要求误差在 90 秒以内。开启系统自动时间同步即可排除这一原因。
Q Hysteria2、TUIC 为什么在有些网络里反而更慢?
A 它们基于 QUIC,使用 UDP 传输。部分运营商、校园网或公司网络会对 UDP 限速、降低优先级甚至阻断,这时基于 TCP 的协议可能更稳定。建议同时保留一两个 TCP 类节点作为备用。
Q 外层已经有 TLS 加密,访问网站还需要 HTTPS 吗?
A 需要。外层加密只保护设备到代理服务器这一段,代理服务器到目标网站之间是否加密,取决于网站本身是否使用 HTTPS。访问 HTTP 网站时,代理服务器可以看到传输的内容。

参考资料

  1. RFC 9293: Transmission Control Protocol (TCP) — IETF
  2. RFC 768: User Datagram Protocol — IETF
  3. RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3 — IETF
  4. RFC 9000: QUIC, A UDP-Based Multiplexed and Secure Transport — IETF
  5. RFC 1035: Domain Names - Implementation and Specification — IETF
  6. VMess 协议配置说明 — V2Fly

本文由 tizivpn.blog 技术组 撰写,最近核对于 。软件界面与服务信息可能随版本变化,发现错误欢迎 反馈。

相关服务资料

以下资料来自本站品牌数据库,按编辑与评测方法整理。

本站部分链接为推广链接,通过链接购买可能使本站获得佣金,不会增加你的费用,也不影响评测记录方式。 了解详情