上一章节讲述了HTTP的报文结构等内容,本章节来了解一下应用层的另一个协议DNS。
在日常生活中,用于标识每个人的唯一标识是身份证号,但是我们在日常的沟通中而不是使用身份证号称呼对方,很明显个18位的身份证号是难以记忆的,我们更倾向于称呼其姓名。同理,在计算机网络中,用于唯一标志一台主机的标识是IP地址,当时在生活中我们访问某一网站不是直接数据对应的网站主机IP地址,而是输入类似www.baidu.com的主机名(hostname)。人们更倾向于使用主机名称,而在计算机主机及网络传输节点中的路由器更倾向于识别IP地址。于是为了这种偏好,于是便有了一种主机名到IP地址映射转换的目录服务,这就是域名系统(Domain Name System,DNS)。
首先来说一下DNS是什么?
- 一个有分层的DNS服务器实现的分布式数据库;
- 一个使得主机能够查询分布式数据库的应用层协议; DNS是运行在UDP协议之上的一个协议。
1 DNS提供服务的流程
来看下DNS工作的流程:
首先了解的是用户主机上运行这DNS的客户端,流程步骤如下:
- 用户在浏览器中输入www.baidu.com进行浏览;
- 浏览器抽取HTTP请求url中的ip或者主机名,当判读为主机名时,将请求的主机名称发送给运行在用户pc上的DNS客户端;
- DNS客户端收到浏览器的请求后,向DNS服务器发送一个包含请求主机名称的请求;
- DNS服务器收到DNS客户端的请求后,从数据库中检索请求的主机(这里的请求是指用户在浏览器中输入的www.baidu.com,而不是用户的主机)名称对应的IP,并将IP数据返回给DNS客户端;
- DNS客户端将接收到的ip信息响应给浏览器;
- 浏览器接收到web服务器的ip地址后,向Web服务发送HTTP请求;
- Web服务在收到请求后,将数据通过Tttp响应给浏览器; 浏览器对响应数据解析,呈现给用户浏览。
上面的流程我们大致的了解了DNS的工作流程,同时DNS还提供一下几个服务:
- 主机别名:
我们在日常生活中称呼别人可能称呼其身份证上的全名,也可能将姓去掉,只称呼其名,或者其他外号。相应的一个主机可能有多个名称,我们把全名称之为规范主机名,而其他的称呼称之为主机别名。DNS也提供主机别名到规范主机名的映射查询。 - 负载均衡:DNS也用于冗余服务器的负载均衡。针对那些访问大的网站,可能使用集群的方式部署多台服务器,那么一个IP地址集合就和一个规范主机名相关联。那么在针对一个规范主机名请求时,DNS服务器可能返回一个IP集合,一般地,浏览器可能使用集合中的第一个(假设浏览器的取值规则为取集合中的第一个),那么DNS服务器可在响应时轮询的将每个IP放入集合的第一位,从而达到负载均衡的作用。
- 邮件服务器别名:当然DNS也可以作为邮件服务器的映射提供查询。
2 DNS的工作原理
在讨论DNS的原理之前,我们来自己考虑一下DNS服务的实现,最开始我们应该想到的是只使用一个DNS服务器,该DNS服务器包含了所有的映射。该DNS对所有的客户请求作出相应。这种实现方法是简单的,但是在当今的互联网是行不通的,这种设计主要包括的问题如下:
- 单点故障:如果这个单节点的DNS服务器崩溃,整个互联万随之瘫痪。
- 通信容量:单个DNS服务器需要处理成千上万的DNS查询,因为每个HTTP或者邮件的发送都可能需要DNS查询。
- 远距离的集中式数据库:当只有一个DNS服务器存在的情况下,那么位于DNS服务器较远的DNS查询请求时延怎么会变得不可忽略,导致一个HTTP请求需要花费更多的时间。
- 维护:单个DNS服务器需要为所有的主机提供映射记录,这使得数据库变得非常庞大,并且需要频繁的更新以维持对新增主机的记录。
上面我们讨论了DNS使用单点服务器带来的一些问题,很明显使用单节点的DNS服务器不易于扩展和维护。实际的DNS是一个有分层的DNS服务器实现的分布式数据库。为了应对扩展问题,DNS以层次方式组织,没有一台DNS服务是包含了所有映射关系的。而是将所有的映射关系分布到每个DNS服务器上。DNS的层次划分大致分为三种:根DNS服务器、顶级域DNS(Top Level DNS,TLD)服务器和权威DNS服务器。结构如下:
那么一个DNS对一个主机名(如www.baidu.com)映射IP查询时,客户端先请求根DNS服务器进行查询,根DNS查询返回代表该主机所属域(com)的顶级域DNS服务器(TLD)的IP地址,然后客户端再通过请求顶级域DNS服务器中之一查询,顶级域DNS服务器返回该主机名称对应的权威DNS服务器IP,客户端再对该主机名对应的权威DNS服务器发起查询,获取到主机名(www.baidu.com)的真实IP地址。接下来我们来了解下各个层级DNS服务的作用:
- 根DNS服务器:有400多台根DNS服务器遍布全球。其主要作用是提供顶级域DNS服务器的IP地址。
- 顶级域DNS服务器(TLD):对于每个顶级域(如com、edu、net、org)及每个国家的顶级域(如cn、fr、和jp),都有顶级域DNS服务器。
- 权威DNS服务器:在互联网上具有可以公共访问的主机(如www.baidu.com)的每个组织机构必须提供公共可以访问的DNS记录,这些记录将主机名映射到IP地址。对于一个网站实现主机名到IP映射可以通过两种方式:一种就是该组织机构搭建自己的权威DNS服务器用于保存主机名到IP映射;另一种方法就是通过支付费用,让这些记录(主机名到IP地址映射)记录到服务提供商的权威DNS中从而提供查询服务。
在上面介绍了DNS的层次结构,在上面所说的层次结构外,还存在一种称之为本地DNS服务器。一般来说,本地DNS服务器不属于上面所说的三层,但是其作用至关重要。本地DNS服务器一般离用户主机比较近,可能只是间隔几个路由器或者就与用户主机位于同一局域网中,当用户主机发起DNS查询时,首先会请求到本地DNS服务器,然后由本地DNS服务器与根DNS服务器、顶级域DNS服务器和权威DNS服务器交互查询指定主机名的IP地址,然后将查询结果返回给用户主机。其 流程大致如下:
如上图所示,请求主机请求本地DNS查询某一主机的IP方式是通过递归查询,而本地DNS服务器通过与每个层级的DNS服务器进行交互时通过迭代查询。
通过上面我们看到一次的DNS的查询请求至少需要发送和接收报文是8个,是否有这种情况?一个用户可能多次访问的均是同一个网站,那么每次都发起从根DNS服务器查询很明显是多余的,同时也是为了减少DNS请求和响应报文在网络中的传输,所以DNS引进了DNS缓存。
下一章节进入运输层的范略,来了解运输层的作用及相应的协议。