读书笔记十:TCP/IP详解之 DNS 域名系统
DNS域名系统介绍
DNS的全称是Domain Name System。它负责把FQDN(域名)翻译成一个IP。最初的DNS系统使用的是一个巨大的hosts.txt文件(windows中就有这个文件),可是一段时间以后,开发者就不得不用数据库来代替hosts.txt文件,最终发展到了现在的分布式数据库。
windows中的hosts文件:
DNS系统结构图
DNS系统是一个巨大的树,最上方有一个未命名树根,代表根域服务器,顶级域名的解析由根域服务器提供支持。
顶级域名分为3个部分:
- arpa是一个用作地址到名字转换的特殊域。(用于支持ptr反向查询)。
- 7个3个字符长的普通域,也叫组织域,分别是company ,education,government,international,military,net,organization
- 所有2字符长的域都是国家域,依据ISO3166中定义的国家代码。
一个独立管理的DNS子树叫做zone,最常见的区域就是二级域名,比如说.com.cn。我们还可以把这个二级域名给划分成更小的区域,比如说sina.com.cn。
DNS系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,根服务器从上至下层层转发查询,直到找到目标为止。DNS还有一个特点就是使用高速缓存,DNS把查询过的数据缓存在闪存里,以便于下次查询时使用。
DNS协议
DNS报文定义了一个既可以查询也可以响应的报文格式。对各个字段简单解释如下
最前面的16个bit唯一的标示了问题号码,用于查询端区别自己的查询。
紧接着的16个bit又可以做进一步的细分,标示了报文的性质和一些细节,比如说是查询报文还是响应报文,需要递归查询与否(一般服务器都支持递归查询,而且不需要任何设置,BIND就是这样)
查询问题后面有查询类型,包括A,NS,CNAME,PTR,HINFO,MX。
响应报文可以回复多个IP,也就是说,域名可以和多个IP地址对应,并且有很多CNAME。
主要资源类型:A记录:ip地址 ;CNAME记录:别名记录;ptr 记录:用于支持反向查询,由IP地址反查域名;MX记录:邮件服务器地址
反向查询
正向查询指的是通过域名得到IP的查询,而反向查询就是通过IP得到域名。例如用host命令,host ip就可以得到服务器的域名,host domainName 就得到IP。
稍微知道一点数据结构的人都能意识到,在正向查询的域里面做反向查询,其做法只有遍历整个数据集合----对于DNS来说,那就是遍历整个数据库, 这将带来巨大的负担,所以DNS采取了另一种方法,使用另一棵子树来维护IP-〉域名的对应表。这个子树的根节点是in-addr.arpa,而一个IP例如192.168.11.2所具有的DNS地址就是 2.11.168.192.in-addr.arpa(ip倒置)。在DNS系统里面,一个反向地址对应一个PTR纪录(对应A纪录),所以反向查询又叫做指针(PTR)查询。
DNS服务器高速缓存
为了减少Internet上的DNS的通信量,所有的名字服务器均使用高速缓存,存放最近用过的名字以及从何处获得名字映射信息的记录。
用UDP还是TCP
DNS服务器支持TCP和UDP两种协议的查询方式,而且端口都是53。而大多数的查询都是UDP查询的,一般需要TCP查询的有两种情况:
- 当查询数据多大以至于产生了数据截断(TC标志为1)(说明响应数据报超过了512bytes),这时,需要利用TCP的分片能力来进行数据传输。
- 当主(master)服务器和辅(slave)服务器之间通信,辅服务器要拿到主服务器的ZONE信息的时候。