关于域名解析,你真的了解吗?
Table of Contents
众所周知,无线电广播源于仿生学,科学家通过蝙蝠和海豚的声波,找到了灵感,无独有偶,互联网这一伟大的创举,同样源于仿生学,人们通过研究蜘蛛结网的原理,建立了互联网!当今全球,互联网系统共分为四大区域,每一个区域都由一件互联网的本体,通过光缆覆盖信号。这四大区域分别被命名为:格兰芬多,斯莱特林,赫奇帕奇以及拉文克劳!
但凡有些常识的人都不会《爱情公寓》里曾小贤的这段胡扯所迷惑(曾老师我不是黑你哈),但恐怕也很难准确找出其中的错误。互联网无处不在,无所不能,却因其虚拟性而让人无处寻觅,无法相见。从你输入网址按下回车的那一刻起,到网页加载完毕任君发落为止——这之间发生的故事,你真的了解吗?
一、相关概念
域名(Domain Name)
域名又称网域、网域名称,是由一串用点分隔的名字组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。
之所以采用域名的方式,是因为IP地址缺少规律难以记忆,而域名因其表达的含义更方便人的记忆与传播。
域名系统(DNS)
DNS (Domain Name System,域名系统) 是互联网上存储域名和IP地址相互映射关系的一个 分布式数据库,能使用户无需记忆可被计算机直接读取的IP地址,借助域名即可访问互联网。
DNS协议运行在UDP协议(当请求大于512字节时,使用TCP协议)之上,使用端口号为53。
DNS就像是一个自动的电话号码簿,我们可以直接拨打abelsu7.cn的名字来代替电话号码(IP地址),而DNS会将便于人类使用的域名转化成便于机器识别的IP地址(如192.168.1.1)。
域名解析(Domain Name Resolution)
通过主机名,最终得到该主机名对应IP地址的过程叫做域名解析,也称 主机名解析。
动态域名解析(DDNS)是将固定的域名与动态的IP地址相对应,可实现外网访问内网,适用于个人以及中小型企业。
DNS记录类型
类型 | 名称 | 内容 |
---|---|---|
CNAME | 别名 | 将域名指向另一个域名 |
TTL | Time To Live | 指定解析记录在DNS服务器中的缓存时间 |
NS | 名称服务器 | 指定对域名进行解析的服务器地址 |
MX | 邮件交换器 | 将域名指向邮件服务器地址 |
A | IPv4地址 | 将域名指向一个IPv4地址 |
二、域名解析流程
计算机访问网站是按照一定顺序的——从输入Url按下回车开始,到网页呈现到用户面前,这之间究竟发生了什么?
小插曲:关于
回车键
的来历,还得从机械的英文打字机说起。在打字机上,有一个部件叫字车
,每输入一个单词,字车就前进一格。当输满一行后,使用者就要推动字车到起始位置,这时打字机会有两个动作:字车归位、滚筒上卷一行(相当于字车下移一行),以便开始输入下一行,这种推动字车的动作叫回车。后来,在电动的打字机上,人们增加了一个直接起回车作用的键,被称为回车键。
哈哈,回归正文,下面正式介绍域名解析相关流程。
系统缓存(hosts)
第一步,浏览器收到用户输入的域名之后,首先会访问系统缓存,即 hosts 设置,格式为IP+域名。
C:\windows\System32\drivers\etc\hosts
Windows系统 hosts 存储目录/private/etc/hosts
MacOS系统 hosts 存储目录/etc/hosts
Linux系统 hosts 存储目录
当域名与本地hosts记录相匹配时,浏览器随即访问该域名在hosts记录中所对应的IP地址,直接去这个IP地址上的服务器获取相关资源,并通过TCP协议传输、加载页面。
然而,本机hosts解析存在着严重的安全问题。一旦电脑遭到入侵,黑客可轻而易举篡改本机hosts记录,使某域名无法解析,发生DNS劫持。
浏览器缓存
第二步,当浏览器遗憾的发现hosts文件中并没有定义该域名的服务器地址时,就会转到浏览器缓存中进行查询域名对应的IP地址。
浏览器的缓存中会保存之前已加载网页的相关资源、TTL生存时间、域名和IP地址的对应关系到本地,再次访问相同网站时可加快加载速度。
如果浏览器缓存中有域名对应的IP地址,就直接访问该IP地址指向的服务器;如果没有,就要开始对域名进行解析,查询DNS解析服务器中的对应关系表。
本地DNS解析(LDNS)
第三步,之前两步获取IP地址,都没有采用解析服务。在之前的操作无果后,就正式进入解析环节了。
首先就有一个问题:浏览器要对域名进行解析,它要怎样判断去哪里进行解析呢?
—— 准确来说,浏览器是怎样找到解析服务器的呢?
上网的前提是连网,而连网则需要找到网络提供商接入、开通,由网络提供商来提供解析域名、分配带宽等服务;而当连入内网环境诸如校园网、公司网络时,解析服务是由学校、公司的相关人员来提供的:即本地DNS解析(LDNS)。如果LDNS的缓存中有该域名和IP地址的对应关系,直接返回IP地址,解析成功。
LDNS解析的工作原理与浏览器缓存解析一致(也可以将内网看做该内网段内的用户的强制默认浏览器):将该内网区域内访问过的域名和IP地址的映射表缓存起来,按照TTL生存时间对缓存进行更新。LDNS解析时先对本地缓存进行查询,一般可达到80%的解析率。
根域名服务器
第四步,如果在LDNS服务器上没有该域名对应的IP地址,无法对其进行解析时,LDNS服务器会发送UDP请求给根域名服务器,根服务器根据域名的后缀返回LDNS顶级域名的服务器地址。
全球只有13台根域名服务器——美国10台,欧洲2台,日本1台,根域名服务器里存储的都是关于顶级域名的服务器地址。
顶级域名服务器
第五步,在LDNS域名服务器发UDP请求给相应的顶级域名服务器之后,顶级域名服务器会将NS记录所对应的解析服务器地址返回给LDNS服务器。
NS
即Name Service
,指定了对域名进行解析的服务器地址,通常为注册该域名的服务器地址。
解析服务器
第六步,当LDNS服务器取回顶级域名中NS记录对应的解析服务器地址后,会访问该解析服务器,从而通过查询域名和IP地址的映射表,根据该域名取得相对应的IP地址,及其TTL值。
如果没有在解析服务器的记录中查询到对应的IP地址,域名解析即宣告失败,也就是我们常见的画面
当然,查询到对应的IP地址并不是域名解析的终点,将域名对应的网页加载并完整的呈现给用户,还有一段路要走呢。
缓存至LDNS
第七步,LDNS服务器从域名解析服务器取回对应的IP地址及其TTL值之后,会先在LDNS的缓存中进行保存,再返回给浏览器。
本机取回解析
第八步,也是最后一步,浏览器从LDNS取回解析的IP地址,通过该IP地址访问网站资源,完成域名解析。
三、解析实例
“纸上得来终觉浅,绝知此事要躬行。” 下面我将以abelsu7.cn的云解析记录为例,浅谈域名解析在Hexo博客搭建中的实际应用。
abelsu7.cn的云解析记录
如图所示,除了默认的NS记录之外,abelsu7.cn共拥有两种记录类型:A记录以及CNAME记录。
- A记录的主机记录为
@
,表示直接解析主域名(即abelsu7.cn),记录值为一个IPv4地址151.101.36.133
,而该地址即为托管至Github Pages的静态页面IP地址。
最后A记录的TTL时长为10分钟,表示该记录在DNS中的缓存时长。
CNAME记录的主机记录共有
@
、www
两种,分别解析主域名以及www.abelsu7.cn
。CNAME记录的记录值为
pages.coding.me
、abelsu7.github.io
,分别指向了Github与Coding.net的Pages服务地址。
针对国内外IP访问的分流策略
Github虽然没有被GFW墙掉,但毕竟服务器位于太平洋彼岸的美国,因此访问速度不尽如人意。偶然发现Coding.net同样提供Pages服务,且服务器位于国内,因此将博客迁移部署至Coding Pages势在必行。
不过,当国外IP访问abelsu7.cn时,解析至Github Pages仍然是第一选择。怎样让国内IP解析至Coding Pages,国外IP解析至Github Pages呢?答案是在云解析中设置线路分流。
回到之前的图片,针对国内线路设置了主机记录为
@
、www
的CNAME记录,表示国内IP访问abelsu7.cn
、www.abelsu7.cn
时解析至Coding Pages服务。而针对国外线路设置了A记录与CNAME记录(当然同样可以设置两个CNAME记录),表示当国外IP访问时解析至Github Pages服务。