什么是DNS?
DNS--Domain name system,域名系统,简单来说就是域名和IP地址间的映射关系。当你在浏览器的地址栏输入网址(或域名,如 www,baidu.com)的时候,在网络中计算机和别的计算机通信是基于IP地址才能找到对方并通信,所以计算机要访问你输入的域名就必须找到这个域名所对应的IP地址是什么,而这个工作就是DNS干的事情,网络上有这样的服务器专门用来建立或维护域名和IP地址的对应关系,这样的服务器就是DNS服务器。
DNS由来历史
- 20世纪60年代末期,美国国防部高级研究计划局(DARPA)开始计划建立一个计算机网络用于内部资源共享,叫ARPAnet。
- 20世纪70年代,ARPAnet只是一个只有几百台计算机节点的网络,计算机之间依靠HOSTS.TXT文件来解析各主机之间的关系。HOSTS.TXT由SRI的网络信息中心(Network Information Center,NIC)来负责维护,由一台单独的主机来负责分发。
- 20世纪80年代初期TCP/IP协议被广范应用于ARPAnet,此时局域网(LAN)的出现使得更多的计算机可以连接在一起,接入网络的计算机也发展到了成千上万台,这种基于TCP/IP协议的本地和区域网络就发展成了Internet主干网络。
- 1988年DARPA终止了ARPAnet试验计划,并拆除了ARPAnet,由美国国家科学基金会投资新建了NSFNET。
- 1995年NSFNET发展成为Internet主干网络。
- 当网络中的主机节点越来越多的时候,HOSTS.TXT逐渐暴露出弊端,主机包含以下几个方面:
- 当时的网络带宽有限,随着节点数的激增HOSTS.TXT也变得越来越大,分发HOSTS.TXT文件带来的网络流量和处理器负载变得让人难以忍受。
- HOSTS.TXT还不能防止有人使用重复主机名的映射关系,如果有相同的主机名称解析将会破坏其它的解析。
- 当HOSTS.TXT传达到网络末稍节点时有可能有的节点信息已发生变化或又新增了一台主机,不能保证一致性。
-
当HOSTS.TXT不能满足当时的需求的情况下,1984年南加州信息科学研究院的Paul Mockapetris负责设计新的系统来取代HOSTS.TXT,并发布了RFC882和RFC883,用于描述DNS,后来被RFC1034和RFC1035取代,也就是现在DNS的规范,这些规范被其它的RFC所扩充,扩充部分包括:潜在的安全问题,实现问题,管理缺陷,名称服务器的动态更新机制以及保证区域数据的安全性。
DNS的软件实现
- BIND
Paul Mockapetris亲自创建了第一个DNS系统叫JEEVES,在此之后被实现的是BIND(Berkeley Internet Name Domain),它是由Kevin Dunlap为BSD unix系统所编写,现在由Internet Systems consortium负责维护。BIND也是迄今为止普及最广的DNS实现。 - DJBDNS(Dan J Bernstein's DNS implementation)
- MaraDNS
- Name Server Daemon(Name Server Daemon)
- PowerDNS
-
Dnsmasq
DNS结构概述
- DNS是一个C/S架构的分布式的数据库,由client端发起查询,server端负责应答,将结果返回给client端。DNS采用的是树形(倒立)结构,类似于linux的文件系统,其结构如图所示:
- 处于最顶层的节点叫根域名,以.(点)号表示,全球总共13台根服务器。
- 每个节点及其所对应的子节点形成一颗树,每一个子树都是DNS系统中的一部分,每一颗子树代表着一个Domain(域),每个域又可以再划分为若干个额外的域(称作子域),但是树的深度最多可达127层,实际上根本用不到这么多层。
-
一个完整的域名表示应该是从树的自下而上的,如:www.163.com.和 mail.163.com.平时我们输入网址并没有输入最后一个.其实是浏览器帮我们自动补上了。每个域名的长度最多有63个字符(不包括.号)
DNS中术语名称
- 域名
树中每个节点都有一个不超过63个字符的域名,任何一个完整域名FQDN(Fully qualified Domain Name)应该是从当前节点至根域以点号分隔来表示,如:www.163.com.DNS中要求在同一个父节点下的子节点不能同名,保证唯一性,但不同父节点下的子节点可以同名 - 域
域分为父域与子域,每个域代表着一颗子树,一个域可能有多颗子树,也就是说一个域可以有多个子域,域是有层级关系的,从域名就可以看出来,如,163域就是com的子域,com域就是根域的子域。 - 授权
域名系统设计的主要目的就是要能实现分散管理,就好比项目经理把一个项目分解成若干个小任务分配给外个员工去做。在域中通常由父域将任务委派给子域完成,父域仅仅保留指向子域数据来源的指针,告诉客户端,你要的信息我已经让谁去处理了,你直接找他吧。 - 名称服务器(nameserver)
存储域命名空间信息的程序叫作名称服务器,名称服务器通常只拥有域命名空间一部分的完整信息,这部分完整信息称作区域(zone),区域的内容可以从文件或另一台名称服务器加载而来,加载过后,这台服务器便可宣称对该区域具有权威。名称服务器又分主从(master,slave),一般slave的区域数据文件从master加载,当master宕机后,slave便可接替master继续工作。 - 区域数据文件,master名称服务器从本机加载的数据文件称为区域数据文件,slave一般配置为从master传送过来的区域数据文件作为备份。数据文件包含了描述区域的资源记录,资源记录描述了区域内所有的主机,并标记了子域的授权情况。
- 资源记录
与域名相关的数据都包含在资源记录中,DNS的资源记录主要有以下几种:- SOA(start of authority 起始授权机构)记录,指名该区域的权威,1个区域文件有且只能有1个SOA记录。
- NS记录,列出该区域的名称服务器
- A记录,名称到IP的映射
- PTR记录,IP到名称的映射
- CNAME记录,别名记录
- MX记录,邮件交换器
- 解析器(resolver)
就是访问名称服务器的客户端程序。当运行在主机上的程序需要从域命名空间中获取信息时就会用到解析器,解析器几乎完全依赖于名称服务器,收集查询指令,向名称服务器发送查询并等待应答,如果没有应答就再次发送。主要任务有以下几个:- 查询名称服务器
- 解释查询信息(可能是资源记录或是错误信息)
- 将信息返回给查询它的程序
递归和迭代
看图就知道