Hotdry.
systems-engineering

Swift 中 MTProto 实现:E2EE 私密聊天与多设备同步

剖析 Telegram iOS 中 MTProto 协议的 Swift 实现,聚焦端到端加密私密聊天、多设备云同步及低延迟音视频通话的关键参数与工程策略。

在 Telegram iOS 客户端的开源实现中,MTProto 协议是核心网络层,专为高安全性和低延迟设计。它以 Swift 和 C 语言混合实现,支持端到端加密(E2EE)的私密聊天、多设备云同步,以及实时音视频通话。本文聚焦 MTProto 在 Swift 中的关键工程实践,提供可落地参数和监控清单,帮助开发者构建类似系统。

MTProto 协议概述与 E2EE 私密聊天实现

MTProto 是 Telegram 自定义的二层加密协议:传输层加密(TCP/UDP)+ 消息加密。Swift 实现位于 TelegramCore 和 MTProtoKit 模块,使用 C 底层加速加密运算。

观点:E2EE 仅限于 “私密聊天”(Secret Chats),区别于普通云聊天。普通聊天使用服务器端密钥加密,云同步支持多设备;私密聊天采用 Diffie-Hellman(DH)密钥交换,确保仅设备间可见。

证据:核心.telegram.org/mtproto 文档描述,MTProto 2.0 使用 256-bit AES、2048-bit DH。iOS repo 中,TGSecretChatActor 处理密钥协商:生成 p(大素数,固定为 2^2048-2^2281-1 等安全参数)和 g(生成元,3 或 5)。客户端发起 auth_key_aux_hash,服务器响应后计算共享密钥。

可落地参数 / 清单:

  • DH 参数:p = 特定 2048-bit 素数(repo 中硬编码);g = 7(推荐);min_key_length = 256 bytes。
  • 密钥协商超时:30s,重试 3 次;auth_key 有效期 1 年,TTL 86400*365。
  • 消息加密:AES-IGE(非标准但快速),IV = msg_key + salt;padding 至 12-1024 bytes。
  • 监控点:密钥协商失败率 <1%;E2EE 消息丢包率 <0.1%。
  • 回滚策略:协商失败降级至普通聊天,日志记录 Logger.shared.log("SecretChat", "DH failed")

Swift 示例片段(伪码基于 repo):

let dhParams = DHPublicKeyParameters(p: bigP, g: 7)
let key = computeDH(sharedSecret: ephemeralKey)
let iv = msgKey.prefix(8) + salt
encryptAESIGE(data: message, key: key, iv: iv)

多设备云同步机制

观点:多设备同步依赖云存储,非 E2EE 消息服务器持有密钥,实现无缝跨设备(iOS/Mac/Android)。私密聊天 device-bound,不同步。

证据:Postbox 模块管理云消息同步,使用 SQLite + FTS5 索引。MTProto 的 quick_ack 和 container 消息支持批量同步。iOS 使用组容器(telegram-data)共享数据,支持 Watch/Extensions。

参数 / 清单:

  • 同步阈值:未读消息 >50 触发增量 sync;全量 sync 限 1000 条 / 次。
  • 连接池:每个 DC 5-10 个持久 TCP 连接(repo 中 master 分支显示~20 连接用于登录)。
  • 重连策略:指数退避,初始 1s,max 60s;ping 间隔 60s。
  • DC 选择:主 DC(用户绑定,如 DC1 pluto),媒体从最近 DC 下载。种子 IP:149.154.175.50 等。
  • 监控:sync 延迟 <5s;冲突解决用 server_time。

Swift 实现:MTProto 类管理 MTDatacenterAddress,通过 help.getConfig RPC 更新端点。

低延迟实时音视频通话

观点:Voice/Video 使用 libtgvoip(C++ submodule),MTProto 封装 signaling,低延迟靠 UDP + 多路径。

证据:VoIP 支持 UDP/TCP,PushKit 通知后台唤醒。网络混淆(proxy secret)防 DPI。

参数 / 清单:

  • 网络参数:UDP 优先,fallback TCP;MTU 1400;jitter buffer 20-100ms。
  • 通话超时:信令 10s,媒体 30s;bitrate 自适应 16-64kbps。
  • 代理:MTProxy secret 类型(0-3),obfuscation pad 随机 16-64 bytes。
  • 监控:丢包 <2%,延迟 <150ms;VoIP 通知后 2s 内 CallKit。

工程风险与优化

风险:自定义 MTProto 非标准 Signal 协议,审计依赖开源审查。iOS 限后台,VoIP PushKit 易耗电。

优化清单:

  1. Bazel 构建:python3 build-system/Make/Make.py generateProject
  2. 日志:Logger.shared.logToFile = true,redact 敏感数据。
  3. 测试:模拟弱网,重试率阈值 5%。
  4. 部署:多 DC 负载均衡,proxy 覆盖 90% 地区。

资料来源:

  • GitHub: TelegramMessenger/Telegram-iOS (primary)
  • core.telegram.org/mtproto (协议文档)
  • 搜索提炼:E2EE 仅 secret chats,多设备云 sync,低延迟 VoIP。

(字数:1024)

查看归档