应用层之DNS域名系统

1.概述

在因特网中,识别一台主机有两种方式,通过主机名或者IP地址。人们喜欢便于记忆的主机名标识方式,而路由器则喜欢定长的、有着层次结构的IP地址。为了折衷这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录服务,这就是DNS域名系统的主要任务。

DNS是:

1.一个由分层的DNS服务器实现的分布式数据库
2.一个使得主机能够查询分布式数据库的应用层协议。

DNS协议运行在UDP之上,使用53号端口

DNS不是一个直接和用户打交道的应用,它是为因特网的用户应用程序以及其他软件提供一种核心功能。DNS通常是由其他应用层协议使用的,包括HTTP、SMTP和FTP等,将用户提供的主机名解析为IP地址。


除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务:

(1)主机别名
有着复杂主机名的主机能够拥有一个或者多个别名。例如,一台名为relay1.west-coast.enterprise.com的主机,可能还有两个别名为enterprise.com和www.enterprise.com。这种情况下,relay1.west-coast.enterprise.com称为规范主机名,而主机别名比规范主机名更加容易记忆。

应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。

(2)邮件服务器别名
我们通常也希望电子邮件的地址比较容易记忆。比如我的邮箱地址可能是my@hotmail.com,然而Hotmail邮件服务器的主机名可能更加复杂,比如类似于relay1.west-coast.hotmail.com这样,所以也需要DNS对其进行解析。

当然,电子邮件应用程序也可以调用DNS,对提供的邮件服务器别名进行解析,以获得该主机的规范主机名及其IP地址。

实际上,MX记录允许一个公司的邮件服务器和Web服务器使用相同的别名。比如一个公司的Web服务器和邮件服务器都能叫做enterprise.com。

(3)负载分配
DNS也用于在冗余的服务器之间进行负载分配。一些繁忙的站点被冗余分布在多台服务器上,每台服务器均运行在不同的端系统上,有着不同的IP地址。所以在这种情况下,一个IP地址集合与一个规范主机名关联。DNS数据库存储着这些IP地址集合。当客户对该主机名进行DNS请求时,服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址次序

因为客户通常总是与IP地址排在最前面的服务器建立连接,所以DNS就在所有这些冗余服务器之间循环分配了负载。

2.工作原理

DNS采用了分布式的设计方案。DNS是一个在因特网上实现分布式数据库的精彩范例。

2.1 分布式、层次数据库

DNS使用了大量的DNS服务器,它们以层次方式组织,并分布在全世界范围内。大致来说,有3中类型的DNS服务器:根DNS服务器、顶级域(Top-Level Domain,TLD)DNS服务器和权威DNS服务器。它们以下图的层次结构组织:

DNS服务器层次结构

  • 根DNS服务器。在因特网上有13个根DNS服务器,它们中的大部分位于北美洲。每台“服务器”实际上是一个冗余服务器的网络,以提供安全性和可靠性。根DNS服务器用来返回TLD服务器的IP地址。
  • TLD服务器。这些服务器负责顶级域名如com、org、net、edu和gov,以及所有国家的顶级域名如uk、fr等。TLD服务器返回权威服务器的IP地址。
  • 权威DNS服务器。权威DNS服务器也即相关组织机构的DNS服务器,它用来返回主机的IP地址。

假定一个DNS客户想要确定www.amazon.com的IP地址,将发生下列事件:
1. 客户事先与根服务器之一联系,它将返回顶级域名.com的TLD服务器的IP地址。
2. 该客户则与这些TLD服务器之一联系,它将为amazon.com返回权威服务器的IP地址。
3. 最后该客户与amazon.com权威服务器之一联系,它为主机名www.amazon.com返回其IP地址。

根、TLD和权威DNS服务器都处在DNS服务器的层次结构中,还有一类重要的DNS,称为本地DNS服务器。一个本地DNS服务器严格来说不属于该层次结构,但它却是很重要的。每个ISP都有一台本地DNS服务器。

本地DNS服务器起着代理的作用,本地主机将DNS请求发向本地DNS服务器,本地DNS服务器将该请求转发到DNS服务器层次结构中。

2.2 迭代查询和递归查询

下图例子假设主机cs.ustc.edu想知道主机cs.csu.edu的IP地址,假设USTC大学的本地DNS服务器为dns.ustc.edu,同时假设CSU大学的权威DNS服务器为dns.csu.edu。

这里写图片描述

【1】主机cs.ustc.edu首先向它的本地DNS服务器dns.ustc.edu发送一个DNS查询报文。该查询报文含有被转换的主机名cs.csu.edu。
【2】本地DNS服务器将该查询报文发送到根DNS服务器,根DNS服务器注意到edu的前缀,所以将负责edu的TLD的IP地址列表返回给本地DNS服务器。
【3】本地DNS服务器再次向这些TLD服务器之一发送DNS查询报文,该TLD服务器注意到csu.edu的前缀,所以将权威服务器dns.cs.edu的IP地址返回给本地DNS服务器。
【4】本地DNS服务器向权威服务器dns.cs.edu发送查询报文,权威服务器用cs.csu.edu的IP地址进行响应。
【5】最后,本地DNS服务器将查询得到的IP地址返回给主机cs.ustc.edu

上述例子同时利用了递归查询迭代查询,cs.ustc.edu向dns.ustc.edu发出的查询是递归查询,因为该查询请求dns.ustc.edu以自己的名义获得该映射。而后继的3个查询是迭代查询,因为所有的回答都是直接返回给dns.ustc.edu。

从理论上讲,任何DNS查询既可以是迭代的也能是递归的,比如,可能是下面的递归DNS查询链:

这里写图片描述

而在实际中,大多遵循第一个图的模式。

2.3 DNS缓存

如果每次DNS解析都要走完上面介绍的整个流程,就会带来网络带宽的消耗和时延,这对于用户和DNS解析系统都是不友好的。

所以当本地DNS服务器在完成一次查询后就会将得到的主机名到IP地址的映射缓存到本地,从而加快DNS的解析速度。实际上,你的访问的解析大多数都是在本地服务器上完成的。

由于主机名和IP地址之间的映射不是永久的,DNS服务器在一段时间后,通常是两天,就会丢弃缓存信息。

3.DNS记录

共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record,RR),资源记录是一个包含了下列字段的四元组:

(Name,Value,Type,TTL)

TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。如果域名解析改动较频繁,比如使用动态IP等,就应该把TTL尽量设小; 如果域名解析不是经常改动,一般可将TTL适当设置得大一点,以加快主机的访问速度。

Name和Value的值取决于Type。

  • 如果Type=A,则Name是主机名,Value是该主机对应的IP地址。即,一条A记录提供了标准的主机名到IP地址的映射。
  • 如果TYpe=NS,则Name是个域,比如csu.edu,而Value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名,比如dns.csu.edu。这个记录用于沿着查询链来路由DNS查询。
  • 如果Type=CNAME,则Value是别名为Name的主机对应的规范主机名。
  • 如果Type=MX,则Value是个别名为Name的邮件服务器的规范主机名。MX记录允许邮件服务器主机名具有简单的别名。

4.DNS报文

DNS只有查询报文和回答报文这两种,并且,查询报文和回答报文有着相同的格式。如下:

DNS报文

【1】前12个字节是首部区域。第一个字段是标识符,它是一个16bit的数,用于标识该查询。这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。

标志字段有若干标志:
- 1比特的“查询/回答”标志位指出报文是查询报文(0)还是回答报文(1)。
- 当某DNS服务器是所请求名字的权威服务器时,1比特的“权威的”标志被置在回答报文中。
- 如果客户在该DNS服务器没有某记录时希望它执行递归查询,将设置1比特的“希望递归”标志位。如果该DNS服务器支持递归查询,在它的回答报文中会对1比特的“递归可用”标志位置位。

首部还有4个有关数量的字段,指出在首部后的4类数据区域出现的数量。

【2】问题区域包含正在进行的查询信息。该区域包括(1)名字字段,指出正在被查询的主机名字;(2)类型字段,指出有关该名字的正在被查询的问题类型,例如是查询A记录还是MX记录

【3】回答区域包含了对最初请求的名字的资源记录。即前文所述的四元组(Name,Value,Type,TTL)。在回答报文中可以包含多条RR,因此一个主机能够有多个IP地址。

【4】权威区域包含了其他权威服务器的记录。

【5】附加区域包含了其他有帮助的记录。例如,对于一个MX请求的回答报文的回答区域包含了一条RR,该记录提供了邮件服务器的规范主机名。该附加区域包含一个类型A记录,该记录提供了邮件服务器的规范主机名的IP地址。


下图是一个DNS查询报文和回答报文的实际例子,通过wireshark抓包:

查询报文:

这里写图片描述

回答报文:

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值