前面已经提到了访问一台机器要靠 IP 地址和 MAC 地址,其中,MAC 地址可以通过 ARP 协议得到,所以这对用户是透明的,但是 IP 地址就不行,无论如何用户都需要用一个指定的 IP 来访问一台计算机,而 IP 地址又非常不好记,于是就出现了 DNS 系统。
DNS 系统介绍
DNS 的全称是 Domain Name System。它负责把 FQDN(就是以"."分隔结尾的名字)翻译成一个 IP。最初的 DNS 系统使用的是一个 巨大的 hosts.txt 文件(很吃惊,用 这个就好使了?),可是一段时间以后,开发这就不得不用数据库来代替 hosts.txt 文件,最终发展到 了现在的分布式数据库。
从书中的143页可以看到,DNS 系统是一个巨大的树,最上方有一个无名树根,下一层是 arpa,com,edu,gov,int,mil,us, cn。等等, 其中 arpa,是域名反解析树的顶端;而 com,edu,等域名本来只用在美国(这就是技术特权啊),但是现在几乎全世界通用;而 us, cn, 等叫做国家域。这个树里面的域名并不是统一管理的,网络信息中心(NIS)负责分配顶级域合委派其他制定地区域的授权机构。
一个独立管理的 DNS 子树叫做 zone,最常见的区域就是二级域名,比如说.com.cn。我们还可以把这个二级域名给划分成更小的 区域。
DNS 系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目 的地通常是根服务器,根服 务器从上至下层层转发查询,直到找到目标为止。DNS 还有一个特点就是使用高速缓存,DNS 把查询过 的数据缓存在某处,以便于下次查询时使用。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
DNS 协议
DNS 报文定义了一个既可以查询也可以响应的报文格式。对各个字段简单解释如下:
最前面的16个 bit 唯一的标示了问题号码,用于查询端区别自己的查询。
紧接着的16个 bit 又可以做进一步的细分,标示了报文的性质和一些细节,比如说是查询报文还是响应报文,需要递归 查询与否(一般服务器都支持递归查询,而且不需要任何设置,BIND 就是这样)
查询问题后面有查询类型,包括 A,NS,CNAME,PTR,HINFO,MX,如果熟悉 BIND 的话,就知道在 zong 的配置 文件里面,每一条记录都记载了各自的类型,比如 A 就是 IP 地址,NS 就是名字服务器。
响应报文可以回复多个 IP,也就是说,域名可以和多个 IP 地址对应,并且有很多 CNAME。
反向查询
正向查询指的是通过域名得到 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)查询。
其他问题的讨论
1DNS 服务器高速缓存
BIND9默认是作为一个高速缓存服务器,其将所有的查询都转交到根服务器去,然后得到结果并放在本地的缓冲区,以加快查询
速度。如果有兴趣可以安装一个 BIND9来尝试一下。而自己定义的 zone 则可以规定其在缓存中的时间,一般是1天(就是配置文件中 的1D)。
2用 UDP 还是 TCP
DNS 服务器支持 TCP 和 UDP 两种协议的查询方式,而且端口都是53。而大多数的查询都是 UDP 查询的,一般需要 TCP 查询的 有两种情况:
当查询数据多大以至于产生了数据截断(TC标志为1),这时,需要利用TCP的分片能力来进行数据传输(看TCP的相关章节)。
当主(master)服务器和辅(slave)服务器之间通信,辅服务器要拿到主服务器的 zone 信息的时候。