那一天,人们终于回想起了被BUG支配的恐惧
Toggle navigation
Home
AboutMe
Links
Archives
Tags
DNS原理浅析
2017-12-20 23:58:12
728
0
0
weibo-007
# DNS原理浅析 ## DNS是什么 DNS(Domain Name System,域名系统)是整个互联网的核心组件,负责域名到IP地址的转换工作。比如说,你要访问`www.baidu.com`就得先通过DNS服务将`www.baidu.com`翻译成IP地址`115.239.211.112`。有的人可能会想,这个不是很简单吗,写一个TXT文本文件保持映射关系不就可以了吗。没错,早期的DNS就是这样的。 ## DNS的历史 在20世纪70年代,当时的计算机网络只有几百台主机。他们确实是采用一个名为`HOSTS.TXT`的文件容纳所有的主机信息,这个文件包含了主机名字——地址的映射关系(你可以想象Linux的/etc/hosts)。这样维持了一段时间后,随着网络规模的爆发,暴露了以下问题 ``` 1. 流量和负载的爆发增长,一台主机根本扛不住 2. 名字冲突问题,当时注册名字是比较随意的 3. 一致性问题,当时变更是通过邮件形式通知的,然后变更配置中心 ``` 毫无疑问,`HOSTS.TXT`方案最终以失败告终。但是当时的人继续探索,他们希望创造出一个系统,以解决单一主机表系统本身所固有的问题。所以今天我们看到了及其复杂的DNS系统 ## DNS设计 被上述`HOSTS.TXT`文件坑惨了之后,DNS被设计成了一个分布式数据库,它允许整个数据库的各个部分进行本地控制。同时,整个网络也能通过客户-服务器的方式访问每个部分的数据。首先为了解决名字冲突,名字被设计成了树状结构,所以我们现在的域名看起来是非常规范的。 ### 域名空间 DNS分布式数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中的路径。这棵逆向树就称为域名空间。这棵树的结构如下: ![image](http://note.youdao.com/yws/api/personal/file/WEBe149e4f0d1a8fcbd76c9640bcb5db598?method=download&shareKey=173a9ac5c649786d2a36eaa559e7c6a3) **域名空间**:这整个树就构成了域名空间,当然,现实生活中可能还有子树 **域名**:树中的一个节点到根节点对的顺序连接表示域名。并且用“.”分割路径上出现的名字。比如`map`节点对应的域名为`map.baidu.com` (我们忽略了路上的根的名字) **域**:一个域就是这个域名空间(整棵树)中的一个子树。域的名字就是子树根节点到树根的域名。图中的灰色圆框就是`baidu.com`域。百度掌管着这个域 这样设计一个很大的好处就是域名分散管理,像`baidu.com`这个域只需要百度管理好就可以了,但是申请`baidu.com`是需要授权的。但是无论百度怎么命名它的子域名,都必须要以`baidu.com`结尾,这样一来,很好避免了命名冲突的问题。 ### DNS域名服务器 新的DNS系统还需要面临一个问题,查询。被之前`HOSTS.TXT`的设计坑惨了之后,DNS域名服务器也被设计成分布式层级结构了。如下图所示 ![image](http://note.youdao.com/yws/api/personal/file/WEB94ba4e08048407c047493f08b79277a5?method=download&shareKey=7ee9437e71a8dcc092e0db6dc274c265) 比如我们想查找`www.baidu.com`的IP地址。那么 ``` 1. 客户端查询根域名服务器,根域名服务器说,我只知道com域名服务器IP地址,然后返回给客户端 2. 客户端询问com域名服务器,com域名服务器说我只知道baidu.com域名服务器IP地址,然后返回给客户端 3. 客户端询问baidu.com域名服务器,baidu.com域名服务器说我知道www.baidu.com的IP地址,然后将IP地址返还给客户端 ``` 上述查询是一个明显的递归询问过程,我们可以得出结论:只要询问根域名服务器,就肯定能找到自己想要的IP,除非这个映射关系不存在。首先的问根域名服务器,那怎么知道根域名服务器的IP地址?注意,根域名服务器的IP地址是不变的,目前全球一共有13台(中国没有,最近的日本有一台)。 根域名服务器,顶级域名服务器,权威域名服务器共同提供DNS域名查询服务。 ## DNS查询设计 ### 解析器 解析器就是访问名字服务器的客户端程序。主机上运行的程序如果要从域名空间中获得信息,就要使用解析器。解析器可以完成以下任务: ``` 1. 向名字服务器提出查询 2. 解释响应信息(可能是资源记录,也可能是出错信息) 3. 向提出请求的程序返回信息 ``` 一般而言,解析器不会直接查询根域名服务器,而是查询本地DNS服务器,本地DNS服务器帮我们查询域名对应的IP。 ### 本地DNS服务 本地要知道域名对应的IP地址,首先要知道向谁查询,注意,本机不会直接向根域名服务器发起查询,本机程序直接向本地DNS服务器发起查询。本地DNS服务器的IP地址,有可能是动态的,每次上网时由网关分配,这叫做DHCP机制;也有可能是指定的固定地址。有一些公网的DNS服务器,也可以使用,其中最有名的就是Google的8.8.8.8和Level 3的4.2.2.2 所以,我们可以直接打开设置本地DNS服务器的地方,直接设置成8.8.8.8,这样我们所有的DNS查询都会通过8.8.8.8这个IP查询,这样设置也是能正常浏览网页的。 ![image](http://note.youdao.com/yws/api/personal/file/WEBfa7f9f1d2e0e463a7b13d619f61bfbe6?method=download&shareKey=d57379bc3cc9ddb9af1c94203bd6eea7) ### DNS查询分析 解析器向本地DNS服务器发起请求,然后等待本地服务器返回即可。但是本地DNS服务器却要从域名空间的根服务器开始不断的询问,知道找到目的地址。下面这张图可以描述整个查询过程。 ![image](http://note.youdao.com/yws/api/personal/file/WEB124aad6acaaf3dec17a7125955cef3fa?method=download&shareKey=bebe6a76fceefc2703dad6fa33acc584) 1. 解析器向本地域名服务器发起查询`map.baidu.com`的IP地址 2. 本地域名服务器向根域名服务器发起查询,根域名服务器没有找到,返回指向`com`域名服务器地址。 3. 本地域名服务器向com域名服务器发起查询,`com`域名服务器也没有找到,返回指向`baidu.com`域名服务器。 4. 本地域名服务器向`baidu.com`域名服务器发起查询,`baidu.com`域名服务器知道`map.baidu.com`的IP地址,并将IP地址返回。 5. 本地域名服务器将获取的IP地址返回给解析器 ### dig命令查看解析过程 使用下面的命令可以查看`bj.58.com`整个解析过程 ``` dig +trace bj.58.com ``` 在Linux操作系统上输入这个命令,可以看到第一段向根域名服务器`.`所有的NS记录(一共13台) ![image](http://note.youdao.com/yws/api/personal/file/WEBb1936c68be872b5afd91ab49662182d6?method=download&shareKey=975ba362620209b171fc63b9459efaaa) 第二段是所有`.com`服务服务器的NS记录,可以看到也是13。 ![image](http://note.youdao.com/yws/api/personal/file/WEB19410a2e2b15f752fe4d5c5cbcbce931?method=download&shareKey=ddf871031c8a9d431b317d5856d8a6bc) 然后是`58.com`域名服务器地址,可以看到有两条NS记录。 ![image](http://note.youdao.com/yws/api/personal/file/WEB2c8811e0e593e51080ea9d125c0a8f56?method=download&shareKey=c771241f22cc7054196d20260c22e095) 最后`58.com`域名服务器是知道`bj.58.com`域名的IP地址的,最终发现`bj.58.com`是一个CNAME记录,指向`ngx-out-3.op.58.com.`,而`ngx-out-3.op.58.com.`的A记录是`115.159.231.179`,这就是我们最终要找的IP地址 ![image](http://note.youdao.com/yws/api/personal/file/WEBe8ea5181ad26d5f230a5b0e65d0e8ebe?method=download&shareKey=470573c504616c0387d92361965b2986) ### 记录类型 通过前面的dig命令查询域名解析过程得知,返回结果有一栏专门显示类型,有`NS`类型,`A`类型,常见的DNS记录类型如下 1. **A记录** 地址记录,返回域名指向的IP地址 2. **CNAME** 别名指向,返回另一个域名 3. **MX记录** 邮件交换记录 返回电子邮件服务器地址 4. **NS记录** 域名服务器记录,用来表明那台服务器进行解析
Pre:
PHP7中Protobuf的安装使用
Next:
基础闯关记-快速排序
0
likes
728
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.