Trojan 的设计思路可以概括为一句话:让流量看起来就是一次普通的 HTTPS 访问。
Trojan 协议的基本原理与使用特点
Trojan 的设计思路可以用一句话概括:让流量看起来就是一次普通的 HTTPS 访问。
这篇解释这个思路是怎么实现的,以及它在实际使用中带来了哪些特点和限制。
先看它要解决什么问题
早期的一些代理协议有明显的可识别特征:特定的握手格式、固定的字节模式、异常的包长分布。这些特征让流量在传输过程中容易被分类和处理。
一种应对思路是不断加密和混淆,让特征更难提取。Trojan 走的是另一条路:不发明新的伪装,直接使用已经无处不在的 TLS。
它怎么工作
Trojan 的运行方式大致是这样:
客户端 ──标准 TLS 握手──> 服务器(同时也是一个正常的 Web 服务器)
↓
握手成功后发送认证信息
↓
认证通过 → 按代理协议转发流量
认证失败 → 当作普通 Web 请求处理,返回网页关键在最后两行。服务器同时扮演两个角色:
- 对于携带正确凭据的连接,它是一个代理服务器
- 对于其他任何连接,它就是一个普通的网站
这意味着如果有人直接访问这个域名,看到的是一个正常网页,而不是任何异常响应。从外部看,这台服务器和一个普通的 HTTPS 站点没有区别。
三个必要条件
因为完全依赖标准 TLS,Trojan 对部署环境有几个硬性要求:
必须有域名
TLS 证书绑定在域名上。没有域名就没有可信证书,连接会被客户端拒绝。
必须有有效证书
证书需要由受信任的机构签发,且在有效期内。自签名证书会触发警告,反而暴露异常。
时间必须准确
TLS 握手会校验证书有效期。客户端时间偏差过大会导致握手失败。
第三点对使用者最有实际影响。
为什么系统时间这么重要
这是最常见的实际问题
如果你的设备时间与实际时间相差超过几分钟,TLS 握手会因为证书"尚未生效"或"已过期"而失败。
表现是:所有节点全部超时,而且看不出任何其他异常。
检查方式:
- Windows:右键任务栏时钟 → 调整日期和时间 → 开启自动设置 → 立即同步
- macOS:系统设置 → 通用 → 日期与时间 → 开启自动设置
- 手机:设置中开启自动设置日期与时间
双系统电脑特别容易出问题:Windows 把硬件时钟当本地时间,Linux 当 UTC,来回切换会产生数小时的偏差。
排查详情见节点全部 Timeout 怎么处理。
与其他协议的对比
| 维度 | Trojan | 一些其他协议 |
|---|---|---|
| 伪装方式 | 直接使用标准 TLS | 自定义加密或混淆层 |
| 部署要求 | 需要域名和有效证书 | 部分只需 IP |
| 配置复杂度 | 较低,参数少 | 差异较大 |
| 对时间的敏感度 | 高(依赖证书校验) | 视协议而定 |
| 性能开销 | 标准 TLS 开销 | 视实现而定 |
这里不做优劣判断——不同协议在不同网络环境下的表现差异很大,没有普适的"最好"。
实际使用中的特点
配置项少。 通常只需要服务器地址、端口、密码和域名(SNI)。参数少意味着出错的可能性也少。
故障模式明确。 由于依赖标准 TLS,失败原因通常集中在几个点:证书问题、时间问题、域名解析问题。排查路径比较清晰。
性能取决于 TLS 实现。 加解密开销与普通 HTTPS 相当。在性能较弱的设备(例如低端路由器)上,加解密可能成为瓶颈。
对 DNS 有依赖。 需要正确解析域名才能连接。DNS 异常会直接导致连接失败,见 DNS 问题排查。
使用者需要知道的
作为使用者,你通常不需要理解协议细节——客户端会处理这些。真正有实际价值的只有两条:
- 保持系统时间准确。 这是 Trojan 类协议最常见的故障原因。
- DNS 解析要正常。 域名解析不了,连接就建立不起来。
其余的配置由订阅提供,不需要手动干预。
注意事项
- 本文描述的是协议的公开设计原理,属于技术知识范畴。
- 具体节点使用什么协议以用户中心的说明为准,本站不对此做任何断言。
- 任何协议都不能保证在所有网络环境下正常工作,实际表现受多方因素影响。
常见问题
Trojan 一定比其他协议好吗?
不一定。不同协议在不同网络环境下的表现差异很大,没有普适的答案。
为什么我的节点显示需要 SNI?
SNI 是 TLS 握手中用来告诉服务器"我要访问哪个域名"的字段。Trojan 依赖它来完成正确的证书协商。这项通常由订阅自动配置。
证书过期会怎样?
客户端会拒绝连接。这属于服务端维护范畴,使用者能做的是确认自己的系统时间正确。
为什么有的节点用域名有的用 IP?
Trojan 需要域名来完成证书校验。如果某个节点配置里是 IP,通常会同时指定 SNI 字段。
理解协议对日常使用有帮助吗?
帮助有限,但知道"时间不准会导致全部超时"这一条,可以省下很多排查时间。