一、DNS概述:
DNS,英文全程"Domain Name System,中文全程:域名系统,作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS基于C/S架构(多数基于套接字架构的都是C/S架构),同时使用TCP和UDP的53号端口,当前,对于每一级域名长度限制是63个字符,域名总长度则不能超过253个字符。
我们都知道,IP地址是由32位的二进制数字组成。用户与因特网上某台主机通行时,显然不愿意使用难以记忆的32位的二进制主机地址。相反,大家更愿意使用比较容易记住的主机名称。这时DNS的出现就将繁琐复杂32位二进制数字解析大家易于接受的字符串形式。
二、DNS即使用TCP又使用UDP
传输层协议
TCP:Transmission Control Protocol 面向连接的协议:双方通信前需要事先建立虚连接
UDP:User Datagram Protocol 无连接的协议:双方无需通信前事先建立虚连接
首先了解一下TCP与UDP传送字节的长度限制:UDP报文最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UPD报文一般不会大于512字节。
区域传送使用TCP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多,因此为了保证数据的正确性,则使用基于可靠连接的TCP。
域名解析时使用UDP协议,客户端向DNS服务器查询域名,一般返回的内容不超过512字节,用UDP传输,不经过TCP三次握手,大大提高响应速度。
三、域名空间
对于DNS域名空间,我们要制定一套命名规则,防止域名出现重复,关于DNS域名规则我们可以将生活中的快递系统联系起来,使用层次的地址结构。当你要邮寄物品给某人时,快递单号上肯定要写上:中国、广东省、惠州市、惠城区、江北市政府xx号。而一个域名看起来则是这样的groups.google.com。
对于Internet来说,域名层次结构的顶级(相当于国际快递地址中的国家部分)由ICANN(互联网名称与数字地址分配机构)负责管理。目前,已经有超过800多个顶级域名,每个顶级域名可以进一步划为一些子域(二级域名),这些子域可被再次划分(三级域名),以此类推。所有这些域名可以组织成一颗树,如下图所示(图片来自Computer Networks:7-1):
顶级域名类别有:
- 通用的顶级域名如:.org、.com、.net、.gov、.edu 等等
- 国家代码顶级域名如:.us、.ca 等,分别对应美国和加拿大的国家代码
- 新的品牌顶级域名,允许组织创建最多64个字符的TLD,如:.linux、.microsoft、.companyname 等
- 基础架构顶级域名如:.arpa
子域名
当访问一个类似mail.google.com这样这样的网站,这里的mail就是googole.com的子域名,只有mail.google.com的名称服务器知道下面存在的所有主机,所以Google会回复是否有一个叫mail的子域名,根名称服务器对此并不知请。
DNS服务器的类型
分为三种DNS服务器:
主DNS服务器
这些服务器上存放了特定域名的配置文件,并且基于此权威地规定了特定的域名的地址。主DNS服务器知道全部在它管辖范围的主机和子域名的地址。
辅助DNS服务器
这些服务器作为主DNS服务器的备份,也承担了一定的负载。主服务器知道辅助DNS服务器存在,并且会向他们推送更新。
缓存DNS服务器
这些服务器上不存放特定域名的配置文件。当客户端请求缓存服务器来解析域名时,该服务器将首先检查其本地缓存。如果找不到匹配项便会询问主服务器。接着这条响应将被缓存起来。
四、工作流程简述
域名到IP地址的解析是由分布因特网上的许多域名服务器程序共同完成的。域名服务器程序在专设的结点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器。
域名到IP地址的解析过程要点如下:当某一个应用需要把主机名解析为IP地址,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可通行。
若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求。这种过程直到能够回答该请求的域名服务器为止。此过程称之为(迭代)
五、域名解析查询:递归及迭代两者区别
1. 主机向本地域名服务器查询一般都是常用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户端的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
2. 本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
就个人理解递归查询可以比喻为我们到政府部门办理事情一样,如果你运气好的话,碰到办事员心情不错而往往事情就能好办很多,直接放下材料就能回去了,剩下的事情就等待处理结果就好了。要万一当天办事员因为失恋了,心情不好,那你就要被告知你所要办理的材料还需要找什么部门,需要谁谁盖章后才能受理,就如一个“皮球“被踢来踢去。如此反复,最后事情一波三折的也还不一定能够办下来,这就是迭代查询。
为提高DNS查询效率,减轻根域名服务器的负荷和减少因特网上DNS查询报文的数量,在域名服务器中广泛使用了高速缓存(或高速缓存服务器),用来存放最近查询过的域名以及从何处获得域名映射信息的记录
当DNS服务器向另一个DNS服务器请求并收到它的响应,就在把它发送给客户之前,把这个信息存储到它的高速缓存中,这个信息会在高速缓存中存在一个生存周期TTL,过了生存周期就删除这条信息。