一、域名与IP地址
互联网的每一台主机都是由IP地址来标识位置的,IP地址要么是纯数字,要么就是数字加字母。要记下来实在是太痛苦了,于是就有了将IP地址就和域名关联起来,我们只需要记下域名就可以了。在浏览器里我们都是输入域名得到相应网页内容的,而不是输入IP地址。但是计算机只能识别IP地址并进行定位,于是就需要进行域名转换IP地址这个过程,这个过程就是DNS域名解析
。
二、域名结构树
域名是按照层级划分的。以B站——www.bilibili.com
为例子,从左到右解读这个域名。
- 首先,是
www
。www
其实是主机名,同样的还有member
、space
等等主机名,这些主机名其实非常方便我们记忆。比如www
我们知道是访问主站的,member
是与会员有关的页面。- 接着,它们的后面都跟着
.bilibili
,也就是都隶属于bilibili
域名统一管理。类似的,www
访问主站,- 最后,
bilibili
后面跟着.com
,有很多网页都是跟着.com
,因为都隶属于com
域名来进行管理。常见的还有.cn
、.net
等等。- 那么对于
.com
、.cn
、.net
这与域名又是谁来管理呢?域名是由点来进行划分的,所以域名的最后也是要有一个点.
来分割的,但是因为最后都是由根来统一管理,就没必要在全部域名的最后写.root
,所以直接把根用点.
表示,而一般我们都会把这个点给忽略掉。
完整的域名结构树表示如下。
三、域名服务器
由域名结构树可以看到,最顶部是由一个点.
来表示的,那么就有一个问题,底下这么多域名最终都会聚由一个根管理能行嘛?实际下这个根是由一群服务器组成的,由国际组织iana负责管理。
如上图,这群服务器仅仅只用了13个不同的域名,这13个域名从a
到m
开头,这13个根域名服务器是由12个独立机构运营的。注意是是13个域名,不是13台机器。那么究竟目前有多少台机器负责根域名服务器的工作呢?大概有1467台。13个域名,但有1400多个节点,也就意味着绝大部分节点的IP地址是一样的。那我们如何与最近一个节点取得联系呢?答案就是任播。采用这种技术,当我们向根域名服务器进行联系时,就能找到离我们最近的根域名服务器了。
根域名服务器会管理.com
、 .cn
、 .net
这些域名服务器,它们被成为顶级域名服务器,也就是Top Level Domain
,简写TLD
。
顶级域名服务器会分别管理各自的域名服务器,比如上面提到的bilibili
和qq
,这些服务器叫权限域名服务器
或者权威域名服务器
。
权威域名服务器就会管理各自的主机,当然实际网络中的管理层次会更复杂。
四、域名解析过程
假设现在我们用浏览器访问B站,在地址栏输入域名后,
- 浏览器首先需要看看自己浏览器缓冲中有没有对应的IP记录,如果有,解析结束;
- 如果浏览器缓存没有(
没命中
),接着查询一下主机本地文件里面有没有对应记录,就是hosts文件
,如果有记录就没必要进行后面的步骤了。- 假设还没命中域名,浏览器就会调用解析器,以通过域名获取IP地址的代码。解析器可以帮助浏览器调用系统的网络功能,它其实就是一段程序,如
gethostbyname
。解析器就相当于DNS客户端
,DNS客户端需要向DNS服务器
查询IP地址。通常我们在网络设置里可以查到自己的DNS服务器地址,DNS客户端就会向此地址发起解析请求。如果没有这个地址,或者DNS服务器地址设置错误,但是又可以上网,就会出现可以上QQ但不能浏览网页的情况,因为QQ是直接使用IP地址访问服务器的。
这台DNS服务器一般是离我们最近的,由ISP
负责管理。ISP就是互联网服务提供商,常见的有中国电信和中国网通等。本地DNS服务器(LDNS
)在收到请求后会查看自己的缓存,如果有就直接返回IP地址,并且会标注非权威non-authoritative
。毕竟本地DNS服务器并不像.com
控管域名,只是帮我们走走流程而已。
- 如果
LDNS
没有缓存,就会向根域名服务器(Root Server
)发起请求。- 根域名服务器返回给
LDNS
一个所查询域的主域名服务器(gTLD Server
,国际顶尖域名服务器,如.com
.cn
.org
等)地址- 此时
LDNS
再发送请求给上一步返回的gTLD
- 接受请求的
gTLD
查找并返回这个域名对应的Name Server
的地址,这个Name Serve
r就是网站注册的域名服务器Name Server
根据映射关系表找到目标ip
,返回给LDNS
- LDNS缓存这个域名和对应的ip
- LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
这里任以访问bilibili
为例,整个过程表示如下。要注意的是解析器与本地DNS服务器之间用的是递归方式传输,传递以后回归,意思是发送数据以后最终返回结果给我就可以了;而本地DNS服务器和三层服务器之间用的迭代方式传输,也就是第一步得到什么,然后第二个,接着第三步。
如果本文对屏幕前的你有帮助,希望给作者点个赞,有任何疑问也欢迎评论区留言,谢谢支持!😉😘