人类更倾向于记忆字符串类型的数据,比如域名“www.baidu.com”,而在访问互联网设备中,计算机网络直接提供的都是由数字构成的IP地址,比如“192.168.45.123”。在用户使用时,让人类记住这样一串数字显然困难,因此,DNS服务出现了,旨在构建IP地址与域名之间的翻译。
-
协议栈情况:
DNS依托应用层协议——DNS协议实现。DNS协议运行在UDP协议之上。
-
全球分布式DNS管理:
DNS的数据是按层级分布式存储的,这样做的好处显而易见:增加了整个系统的鲁棒性和通信容量。
图1 DNS服务器的层级举例
从上至下,DNS服务器可分为:根节点服务器、顶级域服务器、权威域服务器和本地DNS服务器。
- 根节点服务器:全球共有400多个根节点服务器,交由13个机构管理,根节点服务器存储着顶级域服务器的域名和IP地址。
- 顶级域服务器:顶级域服务器分为各领域域名服务器,比如“org,edu,com,net。。。”和国家域名服务器。各顶级域服务器中存储着其所属的权威域服务器的域名和IP地址。
- 权威域服务器:这一层面就是具体各公司的域名了,比如“baidu,neu。。。”。权威域服务器隶属于某个顶级域服务器,通过顶级域服务器的查找从而获得权威域名。
- 本地DNS服务器:这个服务器是一种查询代理服务器,当用户发起DNS请求时,请求会先到达用户附近的本地DNS服务器,由此再向其他DNS服务器查找域名。
-
DNS的递归查找过程:
由于采用了分布式的数据存储架构,域名的查询是递归式的。按照:本地->根节点->顶级域->权威域 的层次进行递归。
图2 DNS的递归查找示意
熟悉各种高级语言的函数递归写法的同学会发现,上图实际上就是一种典型的递归逻辑。依次在递归链路上向深层递归(bfs),然后再按“原路返回”,完成了某域名查询。
-
DNS的缓存机制:
上面的递归过程很好的完成了分布式查找,可是在性能方面明显有优化的空间。没错,就是利用计算机中的“万能优化策略”:缓存技术。
按照上图的递归,每次查找都要在网络中发送多次UDP数据包,而且还要原路返回,这明显会耗费一定时间、占用带宽资源。
如果我们在各级服务器内部(比如内存中)都设置了一张缓存表,把最近收到请求的“域名-IP地址”键值对存入其中,下次访问时遇到相同的域名则直接提供IP地址给对方,这就可以有效地减少了递归深度。
当然,缓存的代价是占用了硬件空间资源,不可能无限制的缓存。通常来说,各级DNS服务器设置一条缓存记录的最长存活时间为2天。