《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 微月人话 「卫剑钒」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

自从美国宣布“清洁网络”行动后,很多懂点网络的人,第一反应是,美国人会下手根域名服务器吗?

这种忧虑可不是一年两年了。

2014年6月24日的《人民日报》上引用专家发言:“目前美国掌握着全球互联网13台域名根服务器中的10台。理论上,只要在根服务器上屏蔽该国家域名,就能让这个国家的国家顶级域名网站在网络上瞬间“消失”。在这个意义上,美国具有全球独一无二的制网权,有能力威慑他国的网络边疆和网络主权。譬如,伊拉克战争期间,在美国政府授意下,伊拉克顶级域名“.iq”的申请和解析工作被终止,所有网址以“.iq”为后缀的网站从互联网蒸发。”1

《信息安全与通信保密》杂志2014年第10期的一篇文章写道:“2004年,由于与利比亚在顶级域名管理权问题上发生争执,美国终止了利比亚的顶级域名.LY的解析服务,导致利比亚从网络中消失3天。”2

对此,我们需要害怕吗?我们需要什么样的反制措施?

不是专家,还真回答不了这个问题。

因为这需要了解DNS的工作原理,了解根域名的管理机制。

这里先给出简要回答:不排除这种可能性,但并不是没有办法。

一句话原因:虽然根不在我们手里,但我们有镜像。

DNS傻瓜书

先了解点基本概念,懂DNS的可以直接跳过本节。

1、DNS是什么?

DNS就是将域名转换为IP的,因为我们人类的记忆力太差,根本记不住IP,而电脑通信又必须用IP,所以人类发明了域名,让我们可以记住baidu.com、taobao.com这种还算能记得住的域名。然后通过DNS,将这些域名转换为电脑需要的IP。

2、DNS是怎么工作的?

每个电脑里面都设置了本地DNS服务器(简称LDNS),需要的时候,就向LDNS发出请求,LDNS在网上问权威域名服务器(简称权威DNS),有时候问一家是不够的,要问一大圈下来,最后才能得到答案。

3、权威DNS是干什么的?

问我一个域名,我告诉你IP,如果我不知道,我告诉你谁可能知道,你再去问它。

4、什么是根域名服务器(简称根DNS)?

当LDNS啥都不知道的时候(也即没有任何缓存),就去问根DNS,根能告诉LDNS下一步该问谁。

5、全世界有多少根DNS?

13个,其中10个在美国,英国和瑞典各1个,日本1个。

6、根DNS的名字和IP都是什么?

在这个网址:

https://www.internic.net/domain/named.root

打开可以看到,里面有13个根的名字和IP,其名字从A.root-servers.net到M.root-servers.net。

A开头那个简称A根,是主根,其他12个(B、C、D、E、F、G、H、I、J、K、L、M)是辅根。

为什么根DNS只有13台?

本节看不懂没关系(一般人都看不懂),你只需要知道,由于历史原因和技术原因,对于IPv4而言,根DNS只能有13个IP。

正宗答案是:DNS主要使用UDP数据报传送报文,不含前面的各种头部,DNS报文要求被控制在512字节之内( RFC1035 ),主要考虑是这个大小几乎可以在互联网上畅通无阻,不会因为路径中某个MTU太小( MTU 通常总会 >= 576,见 RFC791 )而导致IP分片,从而预防了各种不可预期的后果3。

而每一个根DNS在DNS报文中都要占用一定的字节数,比如根的名称、TTL、IP地址等。这样,13个根域名服务器基本上就把空间占差不多了,剩余的字节还要用于包装DNS报头以及其它协议参数,所以根域名服务器不易太多,13个算是比较合适的数目。具体可以看一下“Why 13 DNS root servers?”这篇文章。4

真的只有13台服务器吗?

和很多人想象的完全不一样,这13个根域名服务器,并不是只有13台物理的服务器。

这13个根,只是一个逻辑上的概念,每个根DNS,背后都有多台真正的物理服务器在工作!

截至2020年8月12日,全球一共有1097个根服务器。每一个根都有若干个镜像,分布在全球不同的地方。

图片

这个数目在不断上涨,去年10月1日新中国成立70周年阅兵的时候,我看了一下,是1015个服务器。

这13个根由12个独立的机构管理,比如A根和J根都是由Verisign公司管理,截至2020年8月12日,A根在全球各地有53个站点,J根有185个站点。L根由ICANN管理,全球有167个站点,其中北京2个,上海1个。

在root-servers网站上5,可以查到所有这些根服务器的分布,从网站展示的根镜像服务器地图上看(2020年8月12日),北京有 5 个根镜像服务器,上海 1 个,杭州 2 个,武汉1个、郑州1个、西宁1个、贵阳1个、广州1个、香港 9 个,台北 6 个。

包含港澳台部分,我国一共有28个根镜像。

我国境内发出的对根DNS的请求,其实都由镜像完成了。这一点后面会解释。

现在,为了增长知识,你该硬着头皮看一些DNS细节了。

DNS到底是怎么工作的?

对于IT从业者,希望你能理解并牢牢记住本节的内容。

因为你迟早会遇到有关DNS的困惑。

先介绍一下域名的级别:

.代表根域名, .com这种是顶级域名,也叫一级域名,baidu.com这种叫二级域名, www.baidu.com这种叫三级域名,依次类推。

注:也有其他叫法的,反正你知道这个意思就可以了。

再介绍一下最常见的两种域名服务器:

权威DNS:负责对请求作出权威的回答。权威DNS中存储着记录,最常见的3种:A记录(记录某域名和其IP的对应),NS记录(记录某域名和负责解析该域的权威DNS),CNAME记录(负责记录某域名及其别名)。权威能直接回答的,就回A记录;需要其他权威DNS回答的,就回NS记录,然后LDNS再去找其他权威DNS问;如果该记录是别名类型的,就回CNAME,LDNS就会再去解析别名。

递归DNS:通常就是LDNS,它接受终端的域名查询请求,负责在网上问一圈后,将答案返回终端。

现在举一个具体的例子:比如终端请求www.baidu.com这个域名的IP。

在没有缓存时,LDNS会从根DNS问起:

1、LDNS问根DNS说:“www.baidu.com的IP是多少啊?”。

2、根DNS说:“我哪有时间管你这么细的问题,你去问com顶级域的DNS吧,我只管到顶级域,喏,这些是com顶级域DNS的名字和IP,你去问它们吧”。(以NS记录回应)

3、LDNS又忙问com的权威DNS,com权威DNS说:“你问的这是三级域名,我不管这么多,你去问baidu.com的权威DNS吧,它的名字是ns.baidu.com,他的IP是XXX(这里可能给出多个权威DNS)”。

4、LDNS继续问baidu.com的权威DNS,这次痛快,因为www.baidu.com正是它管的,它可能直接给出A记录,也可能给出CNAME记录,如果是前者,就直接得到IP,如果是后者,就需要对别名再做查询。

5、最终,LDNS得到www.baidu.com的IP,并将其返回给终端。

图片

细心的人会问,在第1步中,LDNS问根DNS的时候,他是怎么知道根DNS的IP的?

这13个IP通常是预先配置在LDNS里面的。在LDNS初始化DNS缓存或者缓存失效的时候,LDNS向自己被预先配置的这些IP中的一个,发起对根的查询(也即询问.的NS记录),获得最新的根DNS的信息6。

对于DNS服务器软件而言,这13个IP,配置在根提示文件(root hints file)中,可能是named.cache或root.ca或root.hints等等之类的文件。

上面就是各种教科书中都会讲到的DNS查询过程,但实际上,没有这么麻烦,因为各个层面都是有缓存的。

实际DNS查询的过程,是这样的:

举个例子,比如用户在浏览器中输入这个域名:123.abc.qq.com.cn

1、浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去hosts文件看,也没有,才会去问LDNS。

2、LDNS会去先看看自己有没有123.abc.qq.com.cn的A记录,要有就直接返回,要没有,就去看有没有abc.qq.com.cn的NS记录,如果有,就去问它要答案,如果没有,就去看有无qq.com.cn的NS的记录,如果有,就去问它,没有就去看有无com.cn的DNS,还没有就去看有无cn的DNS,如果连cn的NS记录都没有,才去问根。

所以,有了缓存以后,教科书上那种从根问起的情况,实际上很少发生。

只有在各处都没有缓存的时候,我们才会问根。

根镜像起什么作用?

根镜像承担起和根一样的功能。

根DNS中,最重要的文件就是根区文件(Root Zone file)。所有顶级域名记录都存在根区文件中。

辅根从主根同步数据,根镜像从根同步数据。最终,所有根和镜像都有着同样的根区文件。

而且最有意思的是,根镜像和根有着同样的IP。

我们知道,全球有一千多个根镜像,但是大多数人不知道,它们一起共享13个IP! 对的。因为只有13个根。

这是如何做到的?答案是任播(Anycast,又译泛播)技术。

不关心技术细节的,请直接看本节的最后一句。

任播最初由RFC1546提出,主要用在DNS根服务器上。

任播是指在IP网络上通过一个IP地址标识一组提供特定服务的主机,服务访问方并不关心提供服务具体是哪一台主机提供的,访问该地址的报文可以被IP网络路由到“最近”的一个(最好也只是一个,别送到多个)服务器上。这里“最近”可以是指路由器跳数、服务器负载、服务器吞吐量、客户和服务器之间的往返时间( RTT,round trip time )、链路的可用带宽等特征值。

这样,一方面,用户可以就近访问;另一方面,即便部分根出现故障也没事。

有些同学可能联想到负载均衡,没错,大致上就是这个意思。

对于中国用户来说,对根的请求,一般不会跑到美国去,而是通过任播技术路由到中国境内的根镜像上。

根DNS是怎么管理的?

根DNS目前由12家机构管理。A根是主根,由美国公司Verisign管理。

根DNS中最重要的文件,根区文件,由ICANN管理。

ICANN(The Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构)是成立于1998年的一家注册在美国的非营利性组织。

根DNS管理的历史变迁过程还是比较复杂的。这里简要说一下。

DNS最初的技术开发者与管理者是美国南加州大学的Jon Postel博士,他掌管互联网初期根DNS的管理和分配。

1988年,美国政府要求Jon Postel采取更安全和更合理的措施来保证互联网核心资源的分配和管理7。于是,大名鼎鼎的IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)被组建,并在DARPA和南加州大学信息科学研究所(ISI)的合同下管理。

IANA负责互联网全局编号和编码的管理与协调,之所以需要这么个机构,是因为互联网协议的值或参数,必须是全球唯一的,否则无法互联互通,比如HTTP协议默认都在80端口等待用户请求,而404编码则一致代表"未找到页面”。IANA主要职责包括IP地址段的分配、协议代码和编号的分配(如协议号、端口号)、自治系统编号 (ASN) 分配、DNS根区管理(包括通用顶级域名gTLD以及国家和地区顶级域名ccTLD管理)等。8

1998年ICANN成立之后,美国商务部以合同形式,委托ICANN承担IANA日常运行,IANA从ISI转移到ICANN之下。

对于顶级域名的管理,ICANN的政策是,每个顶级域名(像com、cn、org这种顶级域名,目前有1000多个)都找一个托管商,该域名的所有事项都由托管商负责。

.cn域名的托管商是中国互联网络信息中心(CNNIC),它决定.cn域名的各种政策。

.com、.net 、.name、.gov这四个顶级域名都由Verisign公司托管。

Verisign和ICANN还是闹过几次不愉快的。9

2003年,Verisign 推出了一项新业务 Site Finder,用户访问没有注册过的.com或.net域名,都会被导向 Verisign 的网站。这意味着,它事实上拥有了所有没有注册过的.com和.net域名。几天之内,Verisign 就挤入了全世界的前10大网站。

ICANN 要求 Verisign 立刻停止该业务,否则将终止域名托管合同。Verisign 屈服了,停止了这项业务,但是接着就把 ICANN 告上了法庭,要求法庭厘请两者之间的合同,ICANN 到底有没有权力干涉它的业务。

2006年底,他们达成了庭外和解。ICANN 同意延长 Verisign 的顶级域名托管合同,并且同意 Verisign 向消费者收取的单个域名注册费的上限,从6美元提高到了7.85美元。这个费用标准,一直沿用到了今天,你去注册一个.com或.net域名,所交的钱有0.18美元是 ICANN 收取的管理费,7.85美元是 Verisign 收取的托管费,其余的钱就是域名零售商的费用。

虽然是ICANN运营着IANA,但毕竟是在美国政府的合同管理之下,全球各国以及民间人士颇有微词,一致认为美国政府应该彻底退出。

2014年3月14日,美国商务部国家通讯与信息管理局(NTIA)宣布愿意将IANA的管理权完全移交给ICANN,并要求ICANN制定移交计划。NTIA尤其强调,移交计划要强化多利益相关方模式,不能以政府间组织或政府领导的组织取代当前NTIA扮演的角色。

2016年3月17日,ICANN向NTIA提交了移交计划。2016年6月9日,NTIA公布审核意见,表示ICANN提交的移交计划满足了此前设定的条件。

2016年8月16日,NTIA宣布不再延期现有合同。

虽然遇到一些阻挠10,最终,2016年10月1日,ICANN和美国商务部之间关于IANA职能的合同到期且不再续约,ICANN彻底成为独立的非营利机构。IANA部门的员工和其他的相关资源都被转移到ICANN新设立的附属机构PTI(Public Technical Identifiers,公共技术标识符)中。

ICANN使用全球多利益相关方治理模型(global multistakeholder governance model)进行管理。PTI董事会共5席,3席由ICANN委派,2席由全球互联网社群代表组成提名委员会产生。2017年2月,ICANN发布PTI董事竞选公告,经半年多轮面试及背景调查,提名委员会于2017年10月26日宣布我国北龙中网的王伟与另一欧洲代表中选。又经一个半月的利益冲突审查,2017年12月13日ICANN董事会正式确认王伟当选。11

我国的根镜像由谁管理?

从目前我所找到的资料看,自2003年以来,我国在不断引进根镜像,尤其是去年,根镜像个数增速很快。

2003年,中国电信引入了国内第一个根镜像节点(F根)。

2005年,I根服务器运行机构在 CNNIC 设立了中国第二个根镜像(I根)。

2006年,中国联通(原中国网通)与美国 VeriSign 公司合作, 在国内正式开通J根镜像服务器,同时引入了全球最大的两个顶级域名 “.COM”和“.NET”镜像节点;引进这些镜像的主要目的是提高根域名和顶级域名的解析性能。

2014年,世纪互联与ICANN合作在中国增设L根域名服务器镜像。

2019年6月24日,工信部批准CNNIC设立六台域名根镜像服务器(F、I、K、L)。这六台域名根服务器编号为 JX0001F、JX0002F、JX0003I、JX0004K、JX0005L 和 JX0006L12,并批准互联网域名系统北京市工程研究中心(ZDNS)设立L根镜像服务器JX0007L13。

2019年11月6日,工信部批复同意中国信息通信研究院设立L根镜像服务器,编号分别为JX0008L、JX0009L。

2019年12月5日,工信部批复同意中国信息通信研究院设立域名根服务器(K根镜像服务器),编号为JX0010K。

2019年12月9日,工信部批复同意CNNIC设立域名根服务器(J、K根镜像服务器),编号分别为JX0011J、JX0012K。

从工信部的批文中可以了解到,相关单位负责根镜像的运行、维护和管理工作,维护国家利益和用户权益,并接受工信部的管理和监督检查。

工信部在给CNNIC的批文中写道:“你中心应严格遵守《互联网域名管理办法》《通信网络安全防护管理办法》及相关法律法规、行政规章及行业管理规定,接受我部的管理和监督检查,建立符合我部要求的信息管理系统并与我部指定的管理系统对接,保证域名根服务器安全、可靠运行,为用户提供安全、方便的域名服务,保障服务质量,保护用户个人信息安全,维护国家利益和用户权益。”

美国能对根DNS做什么手脚?

虽然ICANN是一个独立的非营利性机构,但如果美国政府动用强制力量,A根(主根)的内容仍然存在被篡改的可能。

也就是根区文件可以被篡改。

会怎么篡改?

我们先看看根区文件长什么样。

从ICANN官网上可以下载根区文件:

https://www.iana.org/domains/root/files

该文件保存所有顶级域名的信息,目前大小为2.2M,2万余行。

每当有顶级域名的变动时,该文件就会更新。

我们可以看到,和cn域名解析相关的记录也就那么几十行。

图片

如果删除和cn相关的那些行,很快,就会同步到所有的根中。

然后,在所有的缓存都过期之后,全球所有人都访问不了.cn后缀的网站。

如何应对?

因为我们维护着根镜像,所以我们控制着镜像中的内容。

而中国境内的对根的访问,通过我们的运营商,都会落到对我国根镜像的访问上。

我们可以不同步关于cn的修改。

就这么简单。

可以简单写个程序,每次同步完立刻加上cn记录。

也可以自己搭个主根,完全不和美国的根同步。(相当于另立中央了)

当然,世界各地不在我们管理之下的根和根镜像,如果不加行动,仍然会同步这些删除。

那么,除了中国自己,其他国家的人都无法访问.cn网站。

但是,这些国家很快就会有响应,凡是想访问.cn网站的国家,都会把cn记录加回去,并拒绝同步美国删去的这几行。

最终,只有美国人,访问不了.cn网站。

综上分析,我认为美国这么做的可能性不大,因为这一招过于低劣,将会让美国政府完全颜面扫地,并失去今后在互联网领域的任何话语权。而ICANN也将失去公信力,整个互联网世界,会推选使用新的机构和新的主根。

因为互联网世界的一贯准则就是:如有封禁,就绕过它。

后记

最后,我们看看本文开头所提的两个断网事件是怎么回事:

关于伊拉克域名事件,可以看看清华大学段海新教授的文章:“伊拉克域名.IQ被美国删除的背后以及早期的根域名管理”,里面把整个事件的来龙去脉说的很清楚。主要原因是.iq域名的前任管理者于2002年被关进监狱,新任管理者(NCMC)于2005年才提出申请,而IANA当时还考虑征求新旧代理双方对新授权的一致认可,所以才出现了所谓的“申请和解析工作被终止”。

关于利比亚域名事件,可以看看此文:“利比亚国家顶级域名(.LY)中止服务始末”,事实情况是参与运营.LY的两家机构因争夺归属权而内斗的结果(其中一方关闭了.LY域名服务器的解析)。经过这番变乱,2004年10月,ICANN批准将.LY授予利比亚邮电总公司,.LY事件算是尘埃落定。

本文中提到的风险和应对,主要是我个人的分析,下面看看业内专家的说法。

中国工程院院士、清华大学计算机系主任吴建平在2019年的一次访谈14中表示,DNS根域名服务器不是互联网的“核按钮”。全球互联网根域名服务器运行者,不可能同时关闭所有的根服务器,包括影子服务器。

互联网域名系统北京市工程研究中心(ZDNS)主任毛伟表示15:互联网专家一直都在不断完善域名根系统安全保障机制,就算真的断“根”了,也有应急方法来解决。在境内,可以采用根区数据备份并搭建应急根服务器来解决;在全球层面,可以用根镜像、IPv6环境下的根服务器数量扩展、根服务器运行机构备选机制等方法来解决。

现在,了解了这么多,关于根域名服务器,你是不是放心了很多。

文章目录
  1. 1. DNS傻瓜书
  2. 2. 为什么根DNS只有13台?
  3. 3. 真的只有13台服务器吗?
  4. 4. DNS到底是怎么工作的?
  5. 5. 根镜像起什么作用?
  6. 6. 根DNS是怎么管理的?
  7. 7. 我国的根镜像由谁管理?
  8. 8. 美国能对根DNS做什么手脚?
  9. 9. 如何应对?
  10. 10. 后记