TCP/IP详解notes:04DNS
1.前言
访问一台机器要靠 IP 地址和 MAC 地址,其中,MAC 地址可以通过 ARP 协议得到,所以这对用户是透明的
,
但是 IP 地址就不行,无论如何用户都需要用一个指定的 IP 来访问一台计算机,而 IP 地址又非常不好记,于是就出现了 DNS 系统
1.1 DNS查询和响应的一般格式
1.2 DNS报文首部中的标志字段
1.3 DNS查询报文中问题部分的格式
2. DNS 系统介绍
DNS 的全称是 Domain Name System
.它负责把 FQDN(就是以”.”分隔结尾的名字)翻译成一个 IP.
最初的 DNS 系统使用的是一个 巨大的 hosts.txt 文件(很吃惊,用 这个就好使了?),可是一段时间以后,开发这就不得不用数据库来代替 hosts.txt 文件,最终发展到了现在的分布式数据库
.
DNS 系统是一个分布式的数据库
,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,
根服务器
从上至下层层转发查询,直到找到目标为止.DNS 还有一个特点就是使用高速缓存
,DNS 把查询过的数据缓存在某处,以便于下次查询时使用.
3. DNS 协议
DNS 报文定义了一个既可以查询也可以响应的报文格式.对各个字段简单解释如下:
- 最前面的16个 bit 唯一的标示了问题号码,用于查询端区别自己的查询.
- 紧接着的16个 bit 又可以做进一步的细分,标示了报文的性质和一些细节,比如说是查询报文还是响应报文,需要递归 查询与否(一般服务器都支持递归查询,而且不需要任何设置,BIND 就是这样)
- 查询问题后面有查询类型,包括 A,NS,CNAME,PTR,HINFO,MX,如果熟悉 BIND 的话,就知道在 zong 的配置 文件里面,每一条记录都记载了各自的类型,比如 A 就是 IP 地址,NS 就是名字服务器.
- 响应报文可以回复多个 IP,也就是说,
域名可以和多个IP地址对应,并且有很多 CNAME.
4. 反向查询
正向查询指的是通过域名得到 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)查询.
5. DNS 服务器高速缓存
BIND9默认是作为一个高速缓存服务器,其将所有的查询都转交到根服务器去,然后得到结果并放在本地的缓冲区,以加快查询速度. 如果有兴趣可以安装一个 BIND9来尝试一下.而自己定义的 zone 则可以规定其在缓存中的时间,一般是1天(就是配置文件中 的1D).
6. 用 UDP 还是 TCP
DNS 服务器支持 TCP 和 UDP 两种协议的查询方式,而且端口都是53.
而大多数的查询都是 UDP 查询
的,一般需要 TCP 查询的 有两种情况:
- 当
查询数据多大
以至于产生了数据截断(TC标志为1),这时,需要利用TCP的分片能力
来进行数据传输(看TCP的相关章节). 当主(master)服务器和辅(slave)服务器之间通信
,辅服务器要拿到主服务器的 zone 信息的时候.