MTProto 作为 Telegram 的专属传输层协议,最早在 2013 年公开,随后在 2017 年推出了安全性更高的 MTProto 2.0 版。它并非简单的加密隧道,而是一套围绕会话密钥、消息序列与数据中心路由共同构建的完整通信框架。换句话说,握手成功后,所有业务流量都被包装进一种“自带校验、可容错、可分片”的二进制载体。
协议概述
协议核心由三层组成:Transport(TCP/UDP 任选)、Obfuscation(可选的伪装层)以及 MTProto 本体。Transport 负责底层连接的建立与保持,Obfuscation 通过随机填充和自定义端口掩盖流量特征,防止 ISP 或审查机构轻易识别;真正的安全与可靠性则全部落在 MTProto 层。
密钥协商与安全模型
握手阶段会生成两把关键材料:auth_key(256 位对称密钥)和 server_salt(防重放随机盐)。客户端先发起 req_pq,服务端返回大质数 p、q 与公钥指纹;随后通过 Diffie‑Hellman 交换临时密钥,最终派生出 auth_key。所有后续报文都采用 AES‑256‑IGE 加密,并在每条消息前附加 SHA‑256 MAC,确保机密性与完整性。
消息封装细节
- 消息 ID:64 位时间戳 + 随机偏移,保证全局唯一。
- 序列号:每个会话递增,用于检测丢包与乱序。
- 分片机制:超过 64 KB 的负载会被切割成若干
msg_container,每片独立校验。 - 错误恢复:收到
rpc_error后,客户端可自动重发或切换到备用数据中心。
实际使用时,发送一条文字消息的路径大致是: 用户端 → Transport 层(TCP)→ 加密层(AES‑IGE)→ MTProto 包装 → 服务器端解包 → 业务层(Message)→ 目标用户。 如果在北京的客户端与位于新加坡的 DC 之间出现高延迟,协议会自动切换到最近的节点,几乎感受不到卡顿。
跨平台实现要点
在 Android 与 iOS 上,官方库采用 Kotlin/Swift 原生实现,利用系统的 Network.framework 与 OkHttp 完成底层调度;而桌面端则倾向于 C++ 的 libmtproto,直接绑定到 Qt 或 Electron。无论语言如何差异,统一的二进制协议保证了跨平台消息的零差错传递。
