参考资料是《计网·自顶向下(第七版)》,第 2.4 节。
前言
人类能以多种方式来标识,在生活中大家喜欢用 “名字” 来标识,在登记酒店的时候用 “身份证号” 来标识...
因特网上的主机和人类一样,有多种(两种)方式来标识:
- 主机名 hostname
- IP地址 IP_address
DNS提供的服务
在主机的两种标识中,人们喜欢便于记忆的主机名方式,而路由器喜欢 定长的、有层次结构的IP地址。 自然地,我们需要一种能进行主机名到IP地址转换的目录服务,which is 域名解析系统(DNS Domain Name System) 的主要任务!
注意这里是主要任务,而不是全部任务,让我看看是哪个小傻瓜以为这就是DNS的全部功能? ... 这个傻子就是我..
介绍一下DNS
DNS是:
- 一个由分层的DNS服务器(DNS server)实现的分布式数据库
- 一个使得主机能够查询分布式数据库的应用层协议
DNS是应用层协议: 1. 使用客户-服务器模式运行在通信的端系统之间 2. 在端系统之间通过下面的端到端运输协议来传送DNS报文 与其他应用程序的显著不同是:DNS不是一个直接和用户打交道的应用,相反,DNS为“用户应用”及其他软件提供核心功能——主机名到IP的转换
- DNS协议运行在UDP之上,使用53号端口
因特网体系结构的复杂性大多位于网络的 “边缘”。DNS就是这种设计原理的一个典型范例,DNS通过采用位于网络边缘的客户和服务器,实现了关键的名字到IP的转换功能。
所以DNS都有哪些服务
总结放前面:
- 主机名到IP的转换
- 主机别名
- 邮件服务器别名
- 负载分配
可以看到,除了“耳朵都听出茧”的主机名到IP的转换外,DNS还提供了一些重要的服务,我将依次展开。
主机别名(host aliasing)
复杂的主机能拥有一个/多个别名。
例如,一台名为 relay1.west-coast.enterprise.com 的主机,可能有两个别名 enterprise.com 和 www.enterprise.com 。这种情况下,relay1.west-coast.enterprise.com 称为规范主机名。跟规范主机名相比,主机别名更好记忆。
应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。
邮件服务器别名(mail server aliasing)
人们也希望电子邮箱地址好记忆,所以跟上面的主机别名差不多的,电子邮箱应用程序可以调用DNs来对别名进行解析,以获得该主机的规范主机名和IP。
负载分配(load distribution)
繁忙的站点会被分布在多台服务器上,每台服务器都有不同的IP,因此同一个规范主机名对应一个IP地址集合,DNS服务器中存储着这些IP。
当用户发出DNS请求的时候,DNS server 用这个IP集合进行响应,但在每个回答中循环这些地址次序。用户通常总是向IP地址排在最前面的地址发送HTTP请求,因此DNS就在这些服务器之间循环分配了负载。
DNS的循环同样可以用于邮件服务器
DNS工作机理概述
我们首先来假设下面这一场景:在因特网上只使用一个DNS服务器,该服务器包含有所有的映射。这种集中式的设计非常简单,但是如今因特网里有着数量巨大的主机,这种集中式设计会有以下四个问题:
- 单点故障(a single point of failure)。如果这个服务器崩溃,那么整个因特网都将瘫痪。
- 通信容量(traffic volume)。单个DNS服务器处理所有的DNS查询,恐怖的通信容量。
- 远距离的集中式数据库(distant centralized database)。肯定会出现的情况是:这个单个的服务器距离一些主机太远(可能是地球的另一侧),这将导致严重的时延。
- 维护(maintenance)。这个单个服务器不得不为所有的主机保留记录,导致中央数据库庞大,还要频繁添加新主机。
分布式、层次数据库
为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。
在DNS服务器的层次结构中,有三类DNS服务器:
- 根DNS服务器。有400多个根服务器遍及全世界,由13个不同的组织管理。根服务器提供TLD(顶级域)服务器的IP。
- 顶级域服务器。对于每个顶级域(com / org / edu /..)和所有国家的顶级域(uk / fr / jp /..),都有TLD服务器。TLD服务器提供了权威DNS服务器的IP。
- 权威DNS服务器。多数大学和大公司实现和维护它们自己基本和辅助(备份)的权威DNS服务器。
还有一类万万不可忽视的DNS服务器:本地DNS服务器,虽然严格来说不属于服务器的层次结构,但是它对于服务器的层次结构至关重要。每个ISP都有一台本地DNS服务器。
对于某居民ISP来说,本地DNS服务器可能就与主机在同一个局域网中。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。
下面是一个简单的例子:主机 cse.nyu.edu想知道主机gaia.cs.umass.edu的IP地址。请求主机、本地DNS 以及 各DNS服务器层次结构的交互如下图所示:
在本例中,为了获得一台主机名的映射,一共发送了8份DNS报文: 4份查询报文 + 4份回答报文。 我们假设TLD服务器知道用于主机的权威DNS服务器的IP地址,但这种假设并不总是正确的!如果TLD只是知道中间某个DNS服务器,该服务器依次才能知道权威服务器,那么将多发送起码2份报文。
递归查询: 上个例子里,请求主机和本地DNS服务器之间就是递归查询,即“直接告诉我最后结果”。
迭代查询: 上个例子中的其他请求是迭代查询,即“告诉我下一个DNS服务器的IP地址”。
DNS缓存
为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。
例如,还是在上面的例子中,每当本地DNS服务器接收到一个回答,它能够缓存该回答的信息。缓存时常默认为两天,即两天之后将丢弃缓存的信息。
事实上,因为缓存,除了少数的DNS查询以外,根服务器被绕过了。
DNS记录和报文
所有DNS服务器存储了资源记录(Resource Record, RR),RR提供了主机名到IP的映射。
RR是一个包含了如下字段的四元组:( Name, Value, Type, TTL )
TTL是该记录的生存时间,它决定了该记录应当从缓存中删除的时间。
Name 和 Value 的值取决于 Type :
- type = A。name是主机名,value是该主机名对应的IP。(标准的映射)
- type = NS。name是个域(foo.com),value是知道如何获得该域中主机IP和权威DNS服务器的主机名。该记录用于沿着查询链来路由DNS查询。
- type = CNAME。value是别名为 Name 的主机对应的规范主机名。
- type = MX。value是别名为 Name 的邮件服务器对应的规范主机名。
DNS报文
略(暂时)
在DNS数据库中插入记录
略(暂时)
最后,DNS安全吗? 答案是:安全,十分健壮。(跟DNS的缓存机制关系密切)