1、概述:
DNS(Domin Name System)即域名系统,理论上,所有程序通过使用它们存储的计算机网络地址(如:IP),就可以实现对WEB主页,邮箱以及其他资源的访问,可理论虽然具有普遍性,却不容易被记忆,而且,一旦网站IP迁移(换成其他IP),便会引出许多问题;所以我们引入了DNS,应用某种机制将名字转换为网络地址,来避免这些问题,这种机制是什么呢?
2、DNS解析机制:
DNS的本质是发明了一种层次的,基于域的命名方案(这与计算机OSI七层模型的分层想法类似),并且是用一个分布式数据库系统来实现它的分层方案的,DNS的主要作用在哪呢?它是用来将主机名映射为IP,为了实现这个想法,需要按照以下步骤来实现:
- 首先,要将名字映射为IP地址,应用程序调用一个名为解析器(resolver)的库程序,并且把名字作为参数传递给此程序;
- 然后解析器向本地DNS服务器发送一个包含该名字的请求报文;
- 本地DNS服务器开始查询这个名字,并且返回一个包含该名字对应IP地址的响应报文给解析器;
- 而后解析器再将IP地址返回给调用方,解析成功。
Notes:查询报文和响应报文的方式都作为UDP数据包发送,有了IP地址以后,应用程序即可与主机建立一个TCP连接,或者给它发送UDP数据包;
3、DNS名字空间简介:
前面已经说过,DNS采用的是一种分层思想来实现域名映射的,对于Internet,命名规则是什么,由谁来最终确认?就显得至关重要了。DNS名字空间的顶级由一个专门的组织来负责管理,该组织名称是Internet名字和数字地址分配机构(ICANN,Internet Corporation for Assigned Names and Numbers), 单看现在各大门户机构网站种类繁多,足以令人眼花缭乱,可想而知,域名的划分不是一个一蹴而就、简单易行的事,Internet被划分超过250个顶级域名(top-level domains),譬如:.com .net .edu等,每个域涵盖了许多主机,这些域又可以进一步划分它们的子域(譬如:baidu.com),这些子域又可以再被划分……以此类推,所有这些域可以由一棵树来表示,如下:
域名分两类:Generic是通用域名,Countries是国家或者地区的,关于如何购买域名,另一篇文章已有叙述闲谈:关于这个网站
4、域名资源记录:
无论是一台主机的域还是顶级域,每个域都有与自己相关的资源记录(resource record),这些记录组成了DNS数据库,对于一台主机来说,最常见的资源记录便是它的IP地址,除此之外,还有其他的资源记录,当解析器把一个域名传给DNS时,它就可以获得DNS返回的与该域名相关的资源记录的结果。那什么是资源记录呢?它包括以下五部分:
Domin_name Time_to_live Class Type Value
- Domin_name(域名):指出这条记录适合哪个域,无关顺序;
- Time_to_live(生存期):它指明了该条记录的稳定程度,对于在较长时间内没有跟换过IP的机器,可以将它的生存周期设置长一些,便于缓存和映射过程中的域名查询。
- Class(类别) :对于Internet信息,它总是IN;
- Type (类型) :它指出了这是什么类型的记录,主要包含以下信息:
- A 主机的IPV4地址 值是32位整数
- AAAA 主机的IPV6地址 值是128位整数
- NS 域名服务器 值是本域的服务器的名字
- MX 邮件交换 值是优先级,愿意接受邮件的域
- CNAME 规范名 值是域名
- PTR 指针 值是IP地址的别名
- A 主机的IPV4地址 值是32位整数
5、域名服务器:
每个区域都有自己的域名服务器,这些服务器是持有区域数据库的主机,通常情况下,一个区域有主域名服务器和辅助域名服务器。这里进行的主要操作是查询一个名字和找出其对应地址(即域名解析),域名的解析过程中是从后往前(由树根向子叶)进行的,例如(com→baidu),在该过程中,涉及三个主要技术问题:
- 递归查询与迭代查询:
- 递归查询是指当主机将该域名发送给本地域名服务器后,该域名服务器就会替代主机处理域名解析工作,知道它返回所需要的答案。这里的答案必须是完整的;
- 迭代查询是指:根域名服务器(和后续的域名服务器)并不是递归查询本地域名服务器,它只是返回一个部分答案,并移动到下一个查询操作。本地域名服务器负责继续解析,即发出进一步的查询报文。
- 注记:一般解析同时涉及两种方式,虽然递归查询总是最可取的,但是当请求数量过多时,对于主机来说,负担太大,此时用迭代方法,可以有效减缓主机的响应压力。
- 缓存:
- 所有的查询答案和部分查询答案都会被缓存下来。这样,在进行查询的时候,可以直接从拥有缓存记录的域名服务器开始,这一缓存答案的方法使得域名查询的过程大大简化
- 查询和响应使用的传输层协议:
- 域名系统采用的是UDP协议。DNS消息通过UDP数据包发送,格式简单,只有查询和响应;域名服务器可用此数据包进行解析操作。如果很短时间内没有响应返回,DNS客户端必须重复查询请求;如果重复一定次数后依然失败,则尝试域内另一台域名服务器。这样设计是为了应付服务器关闭和查询过程中丢包的情况。
6、参考资料:
1、《计算机网络》 Andrew&&David 著 清华大学出版社;
2. 《A fun and colorful explanation of how DNS works》