公众号旧文

为什么 东京 明明是 Tokyo,但在网络中却总是被命名为 NRT?

作者:胖子阅读 —

Cloudflare 给源站做免费缓存,不亏吗?

在上面的这篇文章中,我用 F12 打开浏览器控制台,看到命中了缓存:

cf-cache-status: HIT

而命中的节点,则是

cf-ray: ...-NRT

这里的 NRT 代表东京,看到这,你可能也会好奇:

为什么东京明明是 Tokyo,在网络中,却被命名为 NRT,而不是 TOK?

因为你看到的,根本就不是城市名。

一、NRT 不是地名,而是机场代码

NRT,其实是 成田国际机场 Narita International Airport 的三字代码。

这是航空系统里面的一套全球标准,叫做:

国际航空运输协会机场代码,简称 IATA 机场代码。

类似的还有:

  • 北京:PEK(首都机场)
  • 上海:PVG(浦东机场)
  • 洛杉矶:LAX
  • 新加坡:SIN

这些名字,经常坐飞机的朋友,肯定不陌生,因为飞机行李标签上就会打印出来,比如下图中的 JFK 代表的是 纽约肯尼迪机场。

图片

二、为什么互联网直接用了这套体系?

当然是因为好用。

1️⃣ 全球唯一,不会歧义

Tokyo 这个词,并不精确:

  • 是东京都?
  • 是东京市?
  • 还是东京都市圈?

但 NRT 不一样,NRT 只指向单一的地方,没有歧义。

2️⃣ 更短,更适合机器

对程序来说:

  • Tokyo(5个字符)
  • NRT(3个字符)

显然,NRT 更省空间、更统一。

别小看这 2 字的差距,在日志、Header、路由标记里,这是很大的优化。

3️⃣ 历史原因:网络节点 ≈ 机场节点

早期的国际网络基础设施,有一个很有意思的特点:

很多骨干节点,就建在机场附近。

所以一开始:

机房怎么命名?直接用机场代码就完事了!

久而久之,这套命名就固化下来了。

三、Cloudflare 的 NRT,在表达什么?

回到浏览器控制台里的这个 Header:

cf-ray: xxxx-NRT

它表达的是,这个请求,是在东京这个节点被处理的。

但这个东京节点,并不一定在机场旁边,也不一定在成田。

它只是继承了这套命名体系。

四、一个更有意思的视角

你可以把这件事理解成:

人类世界用名字,网络世界用编号。

世界 表达方式
人类 Tokyo
网络 NRT

就像我们记朋友名字,而网站系统记用户 ID,本质是一样的。

五、一个小细节

东京其实有两个机场:

  • 成田国际机场 Narita International Airport → NRT
  • 东京国际机场 Haneda Airport → HND

但你在各种网络服务里,更多看到的是 NRT,却很少看到 HND。

原因是,NRT 是老牌国际枢纽,于是更早被互联网体系采用。

六、再回到最开始的问题

为什么 Cloudflare 不用 Tokyo,而用 NRT?

答案可以总结为:因为 NRT 不是地名,而是全球统一的节点编号。