今天聊个有意思的话题。世界上共有 13 个根域名服务器,其中主根域名服务器是在美国。那美国有没有可能通过根域名服务器掐断中国的互联网呢?在说结论之前,我们先来了解:
- DNS到底是怎么工作的?
- 为什么根域名服务器只有 13 台?
- 美国可以让中国从互联网上消失吗?
DNS到底是怎么工作的?
在上网冲浪时,我们在浏览器输入的都是网站的域名,而不是 Web 服务器的 IP 地址。
原因很简单,域名和 IP 地址的关系就像我们手机通讯录那样,用对方的名字来对应它的手机号码。这样每次拨打电话的时候,直接在通讯录里查名字就可以找到对方的手机号码,而不需要去记忆对方的手机号码。
IP 地址和手机号码都是一长串的数字,如果要去记忆它们,还是挺费劲的。
所以,为了网民上网冲浪舒服点,就搞了个 DNS 服务器,也就是域名解析服务器,它可以通过我们输入的域名来找到 Web 服务器的 IP 地址,然后浏览器再向 Web 服务器发送请求。
域名都是用句点来分隔的,比如 www.server.com
,这里的句点代表了不同层次之间的界限,越靠右的位置表示其层级越高。
根域是在最顶层,它的下一层就是 com 顶级域,再下面是 server.com,所以域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器(com)
- 权威 DNS 服务器(server.com)
我们电脑实际上并不直接访问根域名服务器,而是访问我们「本地的 DNS 服务器」,由它来访问根域名服务器,而且在解析域名的时候,是一个递归的过程。
域名解析是怎样的呢?
现在举一个具体的例子,比如客户端请求 www.server.com 这个域名,解析域名的过程如下:
- 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
- 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
- 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
- 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
- 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
- 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
- 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
至此,我们完成了 DNS 的解析过程,整个过程我画成了一个图:
域名解析的过程蛮有意思的,整个过程就和我们日常生活中找人问路的过程类似,只指路不带路。
那是不是每次解析域名都要经过那么多的步骤呢?
当然不是了,还有缓存这个东西的嘛。
浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。
为什么「本地 DNS 服务器」会知道根域名服务器的 IP 地址?
世界上根域名服务器只有 13 台,这 13 台根域名服务器以英文字母 A 到 M 依序命名,
网域名称格式为“字母.root-servers.org”,而且它们的 IP 地址基本不会变化。
所以,「本地 DNS 服务器」会内置一个根域名服务器的配置文件,通过读取这个配置文件就能找到根域名服务器的 IP 地址。
下面这个图就是 13 台根域名服务器的配置文件的部分内容:
可能有的同学会说,这个是静态的配置文件,如果某一个根域名服务器的 IP 地址改变了,要怎么知道的呢?
其实,「本地 DNS 服务器」首次启动时,并不会先读这份静态的配置文件,而是会先去查根域名服务器的 IP 列表,这个查询过程使用的传输协议是 UDP。
另外,可以看到上图中所有记录的 TTL 值是 3600000 秒,相当于 1000 小时。也就是说,每 1000 小时会去查询一次根域名服务器的列表。
为什么根域名服务器只有 13 台?
严格来讲,是世界上共有 13 个「IPv4协议」的根域名服务器,而 IPv6的根节点不止 13 个。
注意,这 13 个并不是表示背后只有 13 台真正的物理服务器,这 13 个对应的是 13 个 IP 地址,对应了 A-M 13 个编号。通过任播(Anycast)技术,编号相同的根服务器使用同一个 IP(类似一个集群)。
任播最初由RFC1546提出,主要用在 DNS 根服务器上,具体的解释如下:
任播是指在IP网络上通过一个IP地址标识一组提供特定服务的主机,服务访问方并不关心提供服务具体是哪一台主机提供的,访问该地址的报文可以被IP网络路由到“最近”的一个(最好也只是一个,别送到多个)服务器上。这里“最近”可以是指路由器跳数、服务器负载、服务器吞吐量、客户和服务器之间的往返时间( RTT,round trip time )、链路的可用带宽等特征值。
为什么只有 13 个呢?
前面我提到,查询根域名服务器的 IP 列表使用的传输协议是 UDP。
当 UDP 包大小超过 MTU 时,就会在 IP 层进行分片,但是只有第一片有 UDP 头部字段(意味着包含有端口号),由于其它分片没有 UDP 头部字段(意味着没有端口号号),能否通过防火墙则完全看防火墙的脸色,因为防火墙可能会检查端口号。
所以,最好的通信效果就是避免 UDP 包大小超过 MTU 大小,防止在 IP 层发生分片。
Internet 大多数网络接口MTU >= 512,所以RFC1035 规定了 DNS 报文要求被控制在 512 字节之内。
一个查询根域名服务器信息的 DNS 报文要能装下所有的根域名服务节点基本信息,因为 512个字节有限,所以根域名服务节点当然要限制住了。
具体计算细节我不做介绍了,最终算到是 512 字节大小的 DNS 报文可以装下 14 个根域名服务器节点的信息,不过当时的人觉得留一手,不全用完,所以就规定在了 13 个根域名服务器。
美国能让中国从互联网上消失吗?
前面我们知道,根域名服务器共有 13 个。
其中 1 个为主根域名服务器,放置在美国,其余12个均为辅根域名服务器,其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。
可以看到,我们中国并没有一台根域名服务器,而且主根域名在美国,由 ICANN 管理。
如果美国终止 .cn 后缀的解析和申请,会不会导致中国网络瘫痪?
先说结论,这个大可不必担心。
虽说根域名服务器都在国外,但是我们中国已经有很多台「镜像的根域名服务器」了,也就是会向主根域名服务器同步数据到国内的根域名服务器,这意味着根域名服务器的常用记录,我们早就有了备份,相当于我们自己也有了根服务器。
即使美国从主根域名服务器删除了 .cn
记录,也不怕,因为我们已经维护了根域名服务器的镜像,我们自己可以控制镜像的内容,我们可以不同步关于 .cn
记录的删除。
还记得访问根域名服务器是谁吗?就是本地 DNS 服务器,而这个本地 DNS 服务器一般是由国内的网络运营商管理的,只要在我国内对根域名服务器发出的请求,其实都是由这些镜像完成的。对于中国用户来说,对根的请求,一般不会跑到美国去。
所以,国内的用户基本不受影响。不过,其他国家可能就无法访问 .cn 后缀的网站了。