Telegram数据中心解析:DC2和DC3的真相
Telegram 称拥有5个数据中心(DC),在其代码及文档中编号为 DC1 至 DC5。其中,DC1 和 DC3 位于美国迈阿密,DC2 和 DC4 位于荷兰阿姆斯特丹,DC5 位于新加坡。

每个账号在注册时即绑定对应的数据中心,不会随用户的手机号或地理位置变更。用户无法自由选择数据中心——若连接到错误的服务器,系统会返回错误提示,要求客户端切换至账号绑定的正确数据中心。
频频宕机的 DC5
在5个数据中心里,DC5 在中文 Telegram 圈子里“名气”不小——倒不是因为它默默服务着大量中国用户,而是因为它动不动就宕机。
DC5 一宕机,所有绑定该数据中心的用户都没法用 Telegram,圈子里的话题也立刻变成“DC5 怎么又挂了?”。用户只能看着客户端反复显示“正在重新连接”,等恢复后再跑到跨数据中心的群里吐槽 DC5。

DC2 与 DC3 的谜团
为满足群友的好奇心,有人开发了一款机器人,可查询用户所属的数据中心。于是群友们纷纷自查:
- 用+86手机号注册的用户,都在新加坡的 DC5,随时准备迎接下一次宕机;
- 用+1手机号注册的用户,在美国迈阿密的 DC1,既能享受流畅速度,又有稳定体验;
- 用欧洲手机号注册的用户,在荷兰阿姆斯特丹的 DC4,成了中文 Telegram 圈里的稀有群体。
等等……Telegram 不是说有5个数据中心吗?那 DC2 和 DC3 去哪了?

通过对该机器人的消息进行“大数据查询”,似乎确实没有用户来自 DC2 或 DC3。
于是有人猜测,DC2 和 DC3 压根没有用户;也有人分析推测,二者是 DC1 和 DC4 的从属数据中心,仅在主数据中心繁忙时才接收新用户注册。
事实真的如此吗?
Telegram 数据中心分配规则(2022年5月)
结论先行:
- DC1、DC2、DC4、DC5 根据用户注册时提供的手机号国家代码分配,这4个数据中心随时接收新用户注册,且现有用户数量庞大;
- DC3 曾有用户,但约在2020年,其存量用户可能已被迁移至DC1。目前 DC3 大概率无用户,且不再接收新注册。
换句话说,DC2 其实有大量用户,和其他数据中心一样,只要注册时手机号的国家代码属于 DC2 的分配范围(如+49德国),用户就一定会被分配至 DC2。而 DC3 虽仍在运行,但已无关联用户。
既然 DC2 用户不少,为什么前文提到的机器人从未检测到呢?
这是因为该机器人查询数据中心的方法存在缺陷。
我到底在哪个数据中心?
目前常见的查询数据中心的方法有3种。下面我们将注册一个 DC2 账号,逐一测试这些方法。
方法1:登录验证法
使用一个会被分配至DC2的手机号,通过 Telegram 的MTProto 协议(官方客户端采用的协议)连接到DC1,调用auth.sendCode接口,尝试发送验证码注册账号。

此时服务器会返回PHONE_MIGRATE_2错误,提示客户端应连接至 DC2(若先连接到 DC2 再执行上述操作,验证码会直接发送)。
通过这种方式,我们就能确定该账号属于 DC2。此方法也适用于已注册账号,但需要获取用户手机号,因此难以用于查询群成员的数据中心。
方法2:头像/文件定位法
注册好 DC2 账号(下称“新账号”)后,我们用一款可显示用户数据中心的第三方客户端(Plus Messenger),登录另一个账号查看新账号的归属。不过,只有当新账号上传头像后,客户端才能显示其数据中心,此时会显示新账号位于 DC2。

这是因为第三方客户端在下载用户头像时,会从 MTProto 协议的userProfilePhoto结构中的dc_id字段获取用户的数据中心信息。

该方法通过用户上传文件的存储数据中心,来判断用户所属的数据中心。
如果用新账号直接登录第三方客户端查看自身数据中心,客户端可能会采用方法1判断——因为它清楚自己连接的是哪台服务器。
方法3:网页 CDN 识别法
最后,我们用前文提到的机器人查询新账号的数据中心。

哎?这个新账号明明在 DC2,为什么机器人显示是 DC4?
原来,这款机器人是通过 Telegram 的网页 CDN 判断数据中心的。打开 https://t.me/dctest 查看源代码会发现,新账号的头像域名以 cdn4 开头,因此被机器人识别为 DC4 用户。

由于 DC2 和 DC3“借用”了同处一地的 DC4 和 DC1 的域名提供网页 CDN 服务,机器人无法识别出任何 DC2 用户——所有 DC2 用户都会被误判为 DC4 用户。
另一类要求用户发送图片/文件来查询数据中心的机器人,原理类似方法2,能够准确识别用户所属的数据中心。
DC3 用户的消失
用方法2准确查询用户数据中心后我们发现,在全球范围内(尤其是海外群组),DC2 用户并不少见,但 DC3 用户极其罕见。经过大量搜索,我们找到了两位疑似 DC3 用户:@urie**和@flowinglig**。

但进一步分析后发现,他们可能并非真的在 DC3。例如调用photos.GetUserPhotos查看头像列表,@urie**共上传过7张头像,仅有2张存储在 DC3,新上传的头像均存储在 DC1。

同样,查看两位用户的消息历史中的图片,也只有少量旧图存储在 DC3,新图片都存在 DC1。而其他数据中心的用户,所有图片都会存储在对应的数据中心。
此外,@urie**曾在2021年向一款数据中心识别机器人发送文件测试(文件法),结果显示为 DC1。

遗憾的是,由于无法获取他们的手机号,我们无法用方法1(登录验证法)进行准确测试,只能通过方法2(头像/文件定位法)推测:他们已从 DC3 迁移至 DC1。
为进一步确认 DC3 不再接收新用户,我们生成了全球各地区的1万多个手机号,用方法1(登录验证法)测试 Telegram 的数据中心分配规则,结果如下:

测试过程中,我们尽可能让每个号码先连接错误的数据中心——通过返回的PHONE_MIGRATE_X错误,确定号码对应的实际数据中心,同时避免发送过多垃圾短信造成骚扰,或是让帕维尔·杜罗夫(Pavel Durov)因短信费用破产。测试后,我们筛选出已确认分配至 DC4 的号码,再将剩余号码重新连接至 DC4,确保不会遗漏可能分配至 DC3 的号码。
基于以上分析,我们可以得出结论:DC3 确实不再接收新用户,且存量用户大概率已全部迁移至 DC1。
虽然我们没能找到“失踪”的 DC3 用户,但如果你想注册到特定数据中心、避开 DC5 的宕机风险,或是测试机器人是否可靠,现在可以参考上文的图片,选择对应国家代码的手机号注册。
由于 Telegram 的服务器及部分运行机制并未开源,本文的许多结论基于推测。若你发现文章有误或有补充线索,欢迎留言指正。
本文撰写过程中参考了以下项目及内容,在此致谢:
- Hertz 所著的Telegram 数据中心分析报告
- oott123 所著的《我的 Telegram 账号在哪个数据中心?》(网页 CDN 法)[https://lab.best33.com/telegram-datacenter/]
- GramJS
- Plus Messenger(头像定位法)
- @WooMaiBot(网页 CDN 法)
- @where_is_my_dc_bot(文件定位法)
Coxxs
本文(https://dev.moe/en/3025)为 Coxxs 原创作品,转载请注明原文链接。