共计 5494 个字符,预计需要花费 14 分钟才能阅读完成。
简述
这是对萌新的科普内容,尝试通过一个故事的形式艰深地解说分明 DNS 的解析过程,有误的中央欢送大家斧正!
PS:纯文本,无图,当小说看就行。
内容蕴含:
- 域名的公网的解析流程
- 域名在主机外部的解析流程(下篇)
嫌长不看的同学就只用记住 5 个字就行了,“别问我,问他”,这就是 DNS 解析流程的外围。
开篇
小陈穿梭到了平行时空 A 的 20 世纪 60 年代,地点是 US,领有着晚期的第一批计算机,成为了一个程序员。
小白穿梭到了平行时空 B 的 20 世纪 60 年代,地点是 CN,啥也没有。
小陈 :我的电脑应该如何与其它机器通信呢?
答:此时还没有网络,主机之间的通信只能用专用线缆,例如应用串口线一对一进行传输。
小白 :我应该如何与其他人进行分割呢?
答:吼,走路串门,写信。
小陈 :发现缓缓地大家领有的计算机越来越多了,逐步有了多机器通信的需要。怎么办呢?
答:略过多种计划的角逐,最终以太网计划胜出,大家进入到同一个互联网内开始了应用 IP 地址进行通信的年代。
小白 :须要分割的人也缓缓多了起来,走路写信都很麻烦,该怎么办呢?
答:略过残暴的原始资本积累(真搬砖),有钱后装置了一个固定电话,想分割谁拨打对方的电话号码就能说上话。
小陈 :所在的互联网内又有了更多机器,须要通信的主机 ip 太多记不住,交换每次都要配置一长串 IP 地址很麻烦怎么办呢?
答:给常常须要通信的机器的 IP 地址起个别名 (昵称 / 外号) 吧。别名和 IP 地址 寄存在一个文件内(/etc/hosts),每次须要要输出 IP 时,先通过别名去文件内查问一下。
小白 :须要分割的人也更多了,电话号码太多脑袋也记不住了。
答:用一个小本子做电话号码通讯录,每次要打谁的电话,先打开一个本子找出电话号码来。
PS:以前没有手机的年代,很多人随身都带着一个记满号码的本子(包含我 ^_^)。
小陈 :一段时间后,感觉每次都要去手动查问太麻烦,须要简化。
答:写了个程序办法(glibc 内的 getaddrinfo 和 gethostbyname),当前下层利用如果应用名字通信,能够先调用这个办法,主动去 hosts 文件内查问出实在的 IP 地址,再与实在 IP 进行通信。
小白 :一段时间后,也感觉每次都要翻电话本太麻烦。须要简化。
答:买了个手机,保留通讯录到手机外面,后续间接输出人名而后点拨号即可,不须要再管号码了。
欢快的很多年过来啦。。。
小陈:发现了一个问题,本地开发的一个程序,拷贝到别的机器下来后执行出错了,解析进去 IP 地址不是预期的那个指标。
小白:我也发现了一个问题,有天手机没电,拿共事的手机输出“我老婆”,竟然是个男人接听的,吓得给挂了,始终想不明确问题出在哪。
小陈 :找到了问题起因了,大家的 hosts 文件内容有差别和抵触,一个别名在不同主机的文件外面映射成了不同的 IP 地址。
答:提出了个解决办法,当前我来保护一个对立的 hosts 文件, 做公益,收费为大家提供名字到 IP 地址的查问服务。大家主机上配置好我的服务器 IP(做为 DNS 服务器),每次和谁通信前都申请一次我的服务解析出实在 IP 地址即可。
小白 :也找到问题起因了,原来大家手机通讯录外面名字和号码都是不一样的。突发奇想,如何通过一个名字,在应用任何人的手机时也都能保障是打给同一个人的号码呢?
答:也有个解决办法,小白决定本人来保护一个公共电话通讯录和一个总台号码。大家每次打电话前先打给小白的总台号码,而后通知小白一个名字,小白会通知你对方正确的电话号码,大家再按小白通知的这个号码打过来。
PS:相似于 144 提供的号码查问服务。
欢快的很多年又过来啦。。。
小陈 :抗不住啦,随着名气的减少访问量越来越多,而且保护的条目数量也越来越多,我这台电脑无论是网络带宽,还是 CPU 和磁盘容量都支持不住啦!
答:最简略的解决办法,扩容,两台服务器,再不够后就四台。并且公开一个我的服务器清单 (named.root) 给大家,大家每次从这个清单外面任选一个我的主机进行查问解析。
小白 :接电话接到吐,太累了。
答:动员老婆孩子齐上阵,通知大家总机不只有一个,一共有三个,大家轻易选一个打就行。
小陈 :又抗不住了,曾经扩容到 13 台了(13 台 DNS 根域服务器),我一个做公益的,不能这样无限度投入。
答:动员各个组织或国家起来负责,当前你本组织的或外国出一台服务器来给大家提供查问服务。我只负责通知大家这个组织的 IP 是什么,对于这个组织外部的 IP 状况我都不论了。
于是小陈的 13 台服务器当初就不必存寰球的名字和 IP 地址映射表了,只须要存几百个组织和国家的名字和 IP,硬盘容量和 IO 性能这时基本上不必思考了。
PS:向小陈发动域名查问时,如果名字前面的标记归属于某组织,则小陈只会通知你这个组织的 IP 地址,你去那里找它查问。
小白 :我要吐槽,人手不够先不说,通讯录厚比天高也先不说。收费给大家提供号码查问服务,反映慢了还被人喷没有服务意识,做好人难啊!
答:动员热心大众,例如选 100 个宗族大姓的负责人,当前对于这些姓氏的电话号码查问就去找他们姓氏的负责人问。不再回应具体人名的电话号码查问。
于是厚比天高的通讯录一下子缩减成了两三页纸,小白心里美滋滋。
PS:例如呼叫总台找张某某,小白就会间接通知你,姓张的不归我管,我只能通知你张老大的电话,你另外打他的电话去问。
小陈 :曾经有了各组织的独立域名服务器,为什么大家每次还来拜访我的机器进行查问,访问量一点没少。
各主机:只有你有残缺的组织 IP 地址表啊,不找你查找谁查,况且如果有组织更新,减少或缩小了,咱们都是不晓得的啊,不还是得找你啊。
小陈:承受事实。
小白 :曾经有了各姓氏负责人的电话,为什么大家每次都还打我的电话进行查问,我想退出不想干了。
大众:别啊,只有你有残缺的各宗族姓氏负责人的通信录,如果有负责人减少缩小或者换号了,还是得问你啊。
小白:我忍。
小陈 :访问量一劳永逸,这样上来不是个方法,得想方法让访问量升高下来。
小陈:发现起因了:有个机器每天要来查同一个名字一万次,你就不晓得本地记录一份吗?
各主机:要是这个名字对应的 IP 忽然变了,你能被动同时告诉咱们?
小陈:我不能,面对寰球这么多访问者,小陈的 13 台的主机显然是不能的。
小白 :来打电话查问号码的数量越来越多,得想方法缩小一些啊。
小白:发现起因了:李四每天给王五打 80 个电话,每次都来总台问号码,你就不晓得存到本人手机上吗?
李四:万一他哪天忽然换号码了没给我说怎么办,你被动通知我?
小白:“我不能”,看着这满眼期待的几亿用户,小白并没有半秒踌躇。
小陈 :还是得找个方法升高访问量。
答:域名和 IP 的的映射关系尽管是可能会变,但不是随时在变啊,更况且我所保护的这百来个组织的名单更不可能常常会变啊。于是做出了个方法:每次被查问时,除了响应域名所对应的 IP 地址,还另外附加一段内容通知对方这次查问的后果,可能在将来的一段时间(TTL)都不会扭转,倡议对方在这段时间内不要再向我的主机进行这个域名的查问,除非期间拜访对方的 IP 失败了,便能够再来查问。
小白 :我也有个方法升高大家打我总台电话的次数。
答:人的确会换号码,但换的频率必定不高,更何况那些姓氏负责人的电话简直几年不换。于是在每个人来查问号码时,都附加一句,这个号码预计多久内不会变,这段时间能如果能买通就不要找我啦。如果打不通,或者买通了不是你要找的那个人,再来找我从新查。
小陈 :既然我只负责各组织的服务器域名和 IP 映射表,而且它们也很难一年几次,那就设置它们的预期无效工夫(TTL) 为半个月吧。同时倡议各组织的域名服务器将本人所负责的域名的预期无效工夫 (TTL) 设置为 7 天,这样大家就都大大少压力了。
成果:小陈这的 DNS 查问量骤然降落 100 百倍,小陈心里美滋滋。
小白 :那我就将我这保护的各姓氏负责人的电话预期无效工夫设置为 15 天,并且倡议各姓氏负责人将本人所负责的电话号码预期无效工夫设置为 7 天。
成果:小白这里的电话号码查问量也骤然降落 100 百倍,小白心里也是美滋滋的。
欢快的很多年又又过来啦。。。
小陈 :尽管大家都很长时间才来我这查一次,但架不住设施越来越多啊,访问量又涨起来了。
答:须要根本性解决这个问题,不能再面向寰球所有一般设施凋谢服务了。于是想了两个方法:
- 通知各地区的网络运营商,你们能够在当地设置一个 DNS 缓存服务器,缓存任何还在预期可用工夫内的域名解析记录。
如果这个区域内的主机都将域名查问服务器地址指向它们,而缓存服务器应用无效的外部缓存记录间接进行响应。这样将大大减少查问时的耗时,也缩小了比方国内宽带资源的占用。
然而如何让这些设施晓得这个区域内的域名服务器的地址呢?就得靠第二个方法了。 - 分割各主机厂商和操作系统厂商,当前不要在新主机上内置我的 13 台根域名服务器清单了,改为动静获取这个区域内可间接响应最终后果的域名查问服务器。
(理论是在 DHCP 调配 IP 时一并调配的本区域 DNS 服务器地址)
成果:到根 DNS 服务器进行查问的访问量极大地缩小了,当初只有每个区域的缓存服务器才会来拜访查问了。
小白 :尽管大家也是都很长时间才来我这查某个电话号码一次,但同样架不住人越来越多啊,访问量又涨起来了。
答:同样须要根本性解决这个问题,我也想了两个方法:
- 通知各地区应该将当地那个惟一会英语的老师,且违心记录大家号码的人的手机号码公布出来。
- 通知大家我当前不承受中文的查问服务,只承受英文的查问服务。
成果:大家查问电话号码时,先去找那个英语老师,英语老师那里如果有无效的记录则间接响应,没有记录或者记录过期了,则由英语老师拨打小白的电话进行查问。于是小白这里的查问的量又骤然降落,小白再次泣不成声~
至此根本的 DNS 查问流程形容结束。
小陈所在网络的主机须要查问一个域名所对应的 IP 地址时,如查问 abc.com
- 发送申请给本地 DNS 服务器
- 本地 DNS 服务器如果缓存内有就应用缓存的数据进行响应
- 缓存内没有,则本地 DNS 服务器向根域服务器进行查问
- 根域服务器通知本地 DNS 服务器应该去 com 这个组织所负责的子域服务器进行查问, 这个组织的子域服务器 IP 是 XXX
- 本地 DNS 服务器再次向子域服务器进行查问,获取到实在的 IP 地址
- 响应给客户端主机
小白这边的电话号码查问流程也相似
- 李四打英语老师的电话,问王五的号码是什么
- 英语老师这里如果有无效的记录,则间接回复
- 英语老师这里没有,则打电话应用英语向小白进行查问
- 小白通知英语老师,你找王氏负责人问吧,他的电话是 XXXX
- 英语老师打电话问王氏负责人,王五的号码是什么,取得了实在的号码
- 英语老师回复给李四
衍生常识
如果子域服务器也抗不住了,就会参考根域名服务器的这个方法再设置一级孙域名。
例如 abc.def.com,根域始终是那 13 台,子域 (顶级域) 就是 com, 孙域(二级域)就是 def, 曾孙就是 abc, 始终能够有限衍生。
重点是 除了最初一级,之前的每一级都不会侧面答复 IP 是什么,而是通知查问者应该去哪查。
一些域名服务器相干的角色
- 本地 DNS 服务器:一般来说就是接入运营商时主动获取的那个 DNS 服务器,或者是本人配置的第一个 DNS 服务器。
- DNS 缓存服务器:一般来说本地 DNS 服务器就兼了这个角色,两者概念简直统一。如果刻意并列来说,那就是指纯缓存,不转发这种。
- DNS 转发服务器:原意是指只负责转发查问的服务器,但理论本地 DNS 服务器也兼了这个角色。
- DNS 代理服务器:本地无缓存,纯 TCP/UDP 代理。
- DNS 权威服务器:也就是指某个子域或孙域服务器,归属于这个域名下的名称的 IP 是谁它最有发言权。
- 根域名服务器:就是那 13 台寰球根域名服务器。
- DNS 客户端:只能向本地 DNS 服务器进行查问,不能拜访别的节点,起因是它只能承受最终后果,而解决不了“问他”这个逻辑。
PS:终端电脑 DHCP 获取的那个 DNS 服务器地址(192.168.1.1),个别都不是本地 DNS 服务器,而是本地网关兼职的 DNS 代理服务。
如何更新域名的 IP 地址:
要思考到 DNS 缓存服务器会依据 TTL 工夫进行的缓存。
- 激进做法:
先将原域名的 TTL 工夫改短,例如由 7 天改为 1 个小时,正式操作前再改为 1 分钟或更短,改完再调长 TTL 的工夫为 7 天,这样造成的解析到原 IP 的工夫就最多 1 分钟了。 - 理论做法:
流量不大就间接批改,不必管 TTL 工夫,全网很快就会都变了。 - 倡议做法:
原 IP 地址在批改域名地址时仍旧保留并提供服务,等一会儿没流量了再下线。
备注:我之前做域名 IP 变更时,是间接批改的域名,没有管 TTL。但外部设置了原 IP 地址服务入口到新 IP 地址服务入口的流量转发,据察看批改后绝大部分流量都立刻迁徙到了新 IP 地址上,原 IP 很快便没有了流量。
实际上主机侧本地缓存的 DNS 工夫很短,这个下篇来说。
衍生思考
问:为什么 DNS 解析流程最终会是这样的?
答:我认为一个很重要的起因,就是因为它是收费凋谢的。
假如它是付费的呢?按查问次数免费的话,又会如何设计呢?
那就不是“别问我,问他”了,而是“只有我对”。
可能就是各个公司相互摸黑攻打争利,阻挡新技术,千方百计缩小缓存,巴不得连主机本地缓存都给砍了。
思考:为什么 114 的号码查问当初简直没有存在感了呢?
问:本地主机能不能间接向根域服务器进行查问?
答:能够,正如大众如果会英语就能够间接和小白进行查问同理。只不过主机操作系统个别没有都没有内置根域的清单,也没有附带能够解决“问他”逻辑的专用软件。须要本人另外装置软件。
问:本地 DNS 服务器是否能够不通过根域服务器就实现查问?
答:能够,前提是它有一份精确的子域(顶级域)的清单。想想看,这显然是不可能的。
不过独自配置几个罕用顶级域的地址,如(com,cn,net)这几个也能有成果,但很难确保地址变更时能及时同步上。