网络应用之——DNS(Domain name system)-The Internet's Directory Service

DNS(Domain Name System)


DNS是个网路应用,采用client-server架构。同时也是个应用层协议。
但是DNS普遍被其他应用层协议所使用,例如HTTP, SMTP, and FTP(这很好理解,应用之间是可以互相帮忙的嘛):将用户提供的主机名翻译成IP地址

在讲解DNS之前,我们先来了解一组概念

主机名(hostname)

主机名是唯一标识一个主机的方式
例如,cnn.com, www.yahoo.com, gaia.cs.umass.edu, cis.poly.edu

IP地址(IP address)

由于主机名很难被路由器解析,所以主机也被IP地址所唯一标识
IP地址是hierarchical。

网络应用之——域名系统DNS(Domain Name System)

域名系统的任务是:将主机名翻译成IP地址

  • 域名系统是一个以层次形式的DNS服务器实现的分布式数据库,域名系统的服务器通常是UNIX机器
  • 域名系统是一个应用层协议,能够允许主机查询这个分布式数据库,域名系统协议runs over UDP and uses port 53

端口号到底是什么东西?先把端口号理解为主机中一个应用的一个标识吧。只要我们开发一个应用,就必须给这个应用设置一个端口号。

DNS是个网路应用,同时也是个应用层协议。
但是DNS普遍被其他应用层协议所使用,例如HTTP, SMTP, and FTP(这很好理解,应用之间是可以互相帮忙的嘛):将用户提供的主机名翻译成IP地址

举个例子,当浏览器请求URL www.someschool.edu/index.html, 之后的详细过程是怎么样的?
1.浏览器同样的user machine运行DNS应用的客户端
2.浏览器从URL中提取主机名,www.someschool.edu,将这个主机名pass给DNS应用的客户端
3.DNS客户端send一个包含这个主机名的查询给DNS服务器
4.DSN客户端最终受到一个回复,这个回复里面包含了这个主机名的IP地址
5.一旦浏览器从DNS客户端获得了IP地址,浏览器就可以和那个IP地址的80号端口的HTTP服务器进程建立TCP连接。

DNS还提供了其他一些重要的服务

主机aliasing

一个复杂的主机名可以有一个或者更多的昵称

规范主机名(canonical hostname)

主机本身的主机名
主机名的昵称更好记忆

邮件服务器aliasing

DNS可以被邮件应用invoke来获取某个alias hostname的规范主机名。

负载分配(Load distribution)

DNS可以用来执行在重复的服务器之间执行负载分配,例如重复的Web服务器。
一些繁忙的站点(例如cnn.com)在多个服务器之间执行重复。每个服务器run在一个不同的端系统中,每个服务器都有一个不同的IP地址。对于重复的Web服务器,a set of IP addresses就这样和一个规范主机名相关。 DNS数据库包含了this set of IP addresses. 当客户端执对一个主机名执行DNS查询的时候,服务器就会返回一整套IP地址,但是每一次回复都会按照IP地址的次序进行轮转。

因为一个客户端typically发送HTTP请求报文给the iP address listed first in the set, DNS轮转(循环)将流量进行了分布给重复的服务器。

DNS应用到底是怎么工作的?

现在我们讨论DNS应用到底是怎么工作的!我们刚说了DNS还会提供其他服务,例如主机别称,邮件服务器别称和负载分配。但是我们还是拿DNS最主要的功能:将主机名翻译成IP地址 来举例子看一下DNS应用到底是怎么工作的。

假定浏览器需要将用户的主机名翻译成一个IP地址。
那么用户就会调用DNS的客户端,指定需要翻译的主机名。在这个主机上的DNS应用就会把这个主机名接过来,就给网络发送查询报文。

所有的DNS查询和回复报文都被包含在UDP报文段(segment)中发送给端口53。

After a delay, 在用户主机上的DNS就会收到DNS服务器发过来的回复报文,提供了想要的mapping. 然后这个mapping就被pass调用程序中。
从这个角度来看,DNS就是个黑盒子。但是实际上,这个黑盒子的内部非常复杂,包含了大量的分布在全球的DNS服务器。DNS作为应用层协议规定了这些DNS服务器和查询主机之间是如何通讯的。

一个简单的DNS设计会让一个DNS服务器包含所有的mappings。在这个集中式的设计中,客户端直接将所有的查询导向到一个单独的DNS服务器,然后这个DNS服务器直接回应给这个查询的客户端。虽然这种设计看起来很诱人,但是对今天的因特网来说不适合。因为今天的因特网太多了,集中式设计的问题很多!

  • 单点故障(a single point of failure), 如果DNS服务器崩了,整个因特网就崩了
  • 通信容量(Traffic volume)。 一个DNS服务器要handle所有的DNS queries,包括所有的HTTP请求,百万台主机的邮件报文
  • 远距离的集中式数据库(Distant centralized database) 一个DNS服务器不可能close to 所有的查询客户端。这将会导致很大的delays
  • 维护 单个DNS服务器要keep records for all internet hosts。不仅这个集中式的数据库很大,而且每个主机经常要更新

所以, 一个DNS服务器,一个集中式的数据库没有扩展性,所以DNS应用是分布式的设计。OK,下面我们就讲解真正的DNS设计

分布式,层次的数据库

为了处理扩展性问题,DNS使用了大量的服务器,组织成层次的形式,分布在全世界。

初步估计,有3类DNS服务器

  • root DNS servers(根DNS服务器)
  • *域名服务器(top-level domain DNS servers)
  • 权威DNS服务器(authoritative DNS servers)
    这三类服务器组织成层次的形式:

网络应用之——DNS(Domain name system)-The Internet's Directory Service

假定一个DNS客户端想要确定主机名为www.amazaon.com的IP地址。初步估计,接下来的事情是这样的

1.客户端联系一个根服务器,根服务器返回*域名服务器com的IP地址
2.然后客户端联系这些*服务器中的一个,*域名服务器返回一个权威服务器amazon.com的IP地址
3.最后,客户端联系amazon.com的一个权威域名服务器,权威域名服务器返回www.amazon.com的IP地址

除了根域名服务器,*域名服务器,官方域名服务器,还有一类重要的域名服务器叫做local DNS server(本地DNS服务器)

本地DNS服务器(默认名字服务器)

本地DNS服务器严格来讲,不属于DNS的层次结构里面的。但是本地DNS服务器对DNS层次结构式非常重要的。

每个ISP都有一个本地DNS服务器,也叫做默认名字服务器

当一台主机连接上一个ISP之后,ISP就会给从ISP的本地域名服务器中提供一个或者多个IP地址。你可以很容易地确定你的本地DNS服务器的IP地址,一个主机的本地DNS服务器typically close to the host。

对一个机构ISP,这个本地DNS服务器可能就在和这个主机的同一个局域网中。
对于一个居民区ISP, 本地DNS服务typically separated from the host 也就是几个路由器的距离。

当一个主机发起DNS查询的时候,这个查询就会被发送给本地DNS服务器,这个本地DNS服务器就像个代理一样,将这个查询转发给DNS服务器层次结构。

好了,我们来举个例子
有可能让你介绍这个图,我觉得这有可能的
网络应用之——DNS(Domain name system)-The Internet's Directory Service

递归查询(recursive queries)

网络应用之——DNS(Domain name system)-The Internet's Directory Service

迭代查询(iterative queries)

网络应用之——DNS(Domain name system)-The Internet's Directory Service

DNS缓存(DNS Caching)

DNS缓存的Idea很简单。在一个查询链中,当一个DNS服务器收到DNS回复之后,该DNS服务器就可以缓存这个mapping到它自己的本地存储中。

还有DNS记录和报文没有讲,放在下一节讲解吧