一、概述

本篇文章基于《计算机网络》和《计算机网络:自顶向下方法》,为笔者的读书笔记,主要内容如下所示:

  • DNS提供的服务
  • 互联网的域名结构
  • DNS服务器的分布
  • DNS的工作原理
  • DNS记录 & 往DNS插入记录

二、DNS提供的服务

域名系统 DNS(Domain Name System) 提供的服务很简单,就是将便于人们使用的机器名字转换为IP地址。

我们都知道用户与互联网上的某台主机通信时必须知道对方的 IP 地址。相比于难以记忆的IP地址,用户更容易记住的是有具体含义的主机名字,例如我们访问百度的页面通常会选择输入www.baidu.com而不是183.232.231.172;但对于路由器来说,它更喜欢的则是定长的、有层次结构的 IP 地址。所以为了折衷这些不同的偏好,我们需要一种能进行主机名到 IP 地址转化的服务,域名系统 DNS 应运而生。

和 HTTP、FTP 和 SMTP 协议一样,DNS 协议是应用层协议,它同样是采用客户-服务端模式运行在通信的端系统之间。DNS 协议运行在 UDP 之上,采用的端口号是 53。在 Windows/Linux 的命令行窗口下,我们可以输入 dslookup 命令来查询域名对应的IP地址,如下所示:

这里我们以查询百度搜索域名的 IP 地址为例,可以看到返回的结果中显示 www.baidu.com 这个域名下对应两个 IP 地址,分别是183.232.231.172183.232.231.174


三、互联网的域名结构

互联网采用的是层次树状结构的命名方法,任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。域还可以划分为子域,而子域还可继续划分为子域的子域,这样就形成了顶级域、二级域、三级域,等等。下面通过一个例子来说明:

上图是新浪邮件服务器的域名,从语法上将,每一个域名都由标号(label)序列组成,各个标号之间用点隔开。其中标号 com 是顶级域名,标号 sina 是二级域名,标号 mail 是三级域名。DNS 对标号有如下规定:

  • 级别最高的顶级域名写在最右边,级别最低的域名卸载最左边;
  • 域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符;
  • 英文字母不区分大小写,也就是说 mail 和 MAIL 在域名中是等效的;
  • DNS既不规定一个域名需要包含多少个下级域名,也不规定每一级域名代表什么意思;
  • 各级域名由上一级的域名管理机构管理,而最高的顶级域名则由ICANN进行管理,这种方式可以确保每一个域名在整个互联网范围内都是唯一的

需要注意的是,域名中的点和IP地址中的点并无任何关系,域名只是一个便于人们使用和记忆的字符串,和IP地址存在映射关系。至于域名中的点所对应的顶级域名、二级域名等,和下面将要介绍的 DNS 的分布式和层次性设计有着很大的关系。


四、DNS服务器的分布

从理论上来说,整个互联网可以只使用一个 DNS 服务器,该服务器包含所有的映射,客户直接将所有查询发往一个 DNS 服务器,同时该 DNS 服务器直接对所有的查询客户做出响应。但是它并不适用于当今庞大的互联网,这种设计含有以下缺陷:

  • 单点故障。如果该 DNS 服务器崩溃,整个互联网随之瘫痪。
  • 通信容量。单个 DNS 服务器不得不处理所有的 DNS 查询,这很容易造成拥塞现象。
  • 远距离的集中式数据库。单个 DNS 服务器无法照顾到所有地区的用户,当用户距离 DNS 服务器非常遥远时,很容易造成严重的时延。
  • 维护。单个 DNS 服务器为所有互联网主机保留记录,这将导致该数据库异常庞大,对该数据库进行的任何修改操作将变得异常困难,维护成本高昂。

正是基于以上总总缺陷,DNS 的服务器不会被设计成这种集中式的结构,而是采用了一种分布式的设计方案。

1. 分布式的DNS服务器

分布式 DNS 服务器的设计思路如下图所示:

可以看到,DNS 除了是分布式的系统之外,它还是一个具有层次的层次性系统,这么做是基于可扩展性的考虑。这些 DNS 服务器分布在全球各地,没有一台 DNS 服务器拥有互联网上所有主机的映射,相反,该映射分布于所有的 DNS 服务器上。DNS 服务器可大致分为如下三类:

  • 根 DNS 服务器:位于最高层次的 DNS 服务器;所有的根 DNS 服务器都知道所有的顶级域名服务器的域名和 IP 地址;根 DNS 服务器是最重要的 DNS 服务器,大部分情况下它并不直接把待查询的域名转换成 IP 地址(根 DNS 服务器也没有存放这种信息),而是高速本地域名服务器下一步一个找哪一个顶级域(DNS)服务器进行查询。
  • 顶级域(DNS)服务器:这些服务器负责顶级域名如 com、org、net、edu 和 gov,以及所有国家的顶级域名如 uk、fr 和 cn。
  • 权威 DNS 服务器:在互联网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录。这些记录将这些主机名映射为 IP 地址。一个组织机构的权威 DNS 服务器收藏了这些 DNS 记录。一个组织机构能够选择实现它自己的权威 DNS 服务器以保存这些记录或支付一定费用让这些记录存储在某个服务提供商的一个权威 DNS 服务器中。

这三种类别的 DNS 服务器和上图的对应关系为:根 DNS 服务器位于最顶层;顶级域 DNS 服务器位于第二层,如 com DNS服务器、org DNS服务器等;而顶级域 DNS 服务器的下一层为权威 DNS 服务器,如 com DNS服务器下有 yahoo.com DNS服务器。

2. 本地DNS服务器

根、顶级域和权威 DNS 服务器都处在上图所示的 DNS 层次结构中,除此之外还有一类非常重要的 DNS,称为本地 DNS 服务器(local DNS server) 。一个本地 DNS 服务器严格来说并不属于该服务器的层次结构,但它对 DNS 层次结构是很重要的,因为当一台主机发出 DNS 查询请求时,这个请求的报文就发送给本地 DNS 服务器。每个 ISP(如一个大学或一家公司)都可以有一台本地 DNS 服务器(也叫默认 DNS 服务器)。本地 DNS服务器离用户较近,一般不超过几个路由器的距离。以笔者电脑为例,本地 DNS 服务器的设置如下所示:

上图中的首选 DNS 服务器和备用 DNS 服务器均表示本地 DNS 服务器的地址,这里笔者选择的是 Google 的公共 DNS 服务器进行域名解析。

而本地 DNS 服务器还有一个非常重要的功能是对局域网中的域名进行解析。例如一个大学的内部组建了一个只需要在校园网内互联的局域网时,由于局域网内部的域名并没有(也不需要)向公众公开,那么学校内部就需要维护一个本地 DNS 服务器,将学校内部的域名和对应的IP地址进行映射,从而实现校园网内部的域名解析。

那么这个学校自己维护的本地 DNS 服务器是否可以访问外网呢?答案是可以。每一个本地 DNS 服务器都会知道根服务器的 IP 地址,当本地 DNS 服务器中没有请求域名所对应的 IP 地址时,就会向根 DNS 服务器进行查询,有了根 DNS 服务器,就可以查到外网所对应的 IP 地址了,这在下面的篇幅会进行解释。


五、DNS的工作原理

上面介绍完了DNS服务器的分布式和层次式结构之后,接下来我们来介绍 DNS 服务器的工作原理。

1. 递归查询和迭代查询

DNS 的查询采用递归和迭代查询两种形式,其中主机向本地 DNS 服务器查询发起的为递归查询,而本地 DNS 服务器后续的查询一般为迭代查询,如下图所示:

这里以查询 www.google.com 的IP地址为例:

  • 首先,主机先向本地 DNS 服务器发出请求报文进行查询,注意该查询为递归查询;
  • 如果本地 DNS 服务器有相关记录,直接返回结果,否则的话会向根 DNS 服务器查询;
  • 根 DNS 服务器会告知本地 DNS 服务器,下一次应当查询的顶级域名服务器为 com DNS服务器;
  • 本地 DNS 服务器接着会向 com DNS服务器进行查询,com DNS服务器会告知本地 DNS服务器接下来应该向权威DNS服务器 google.com 查询;
  • 本地 DNS 服务器继续向 google.com DNS 服务器查询,google.com DNS 服务器就会返回 www.google.com 的 IP 地址给本地 DNS 服务器。
  • 本地 DNS 服务器最后把查询结果高速主机。

以上所示查询中,后面的三个查询均为迭代查询,而主机向本地服务器发起的查询为递归查询,这种情况总共需要使用 8 个 UDP 数据报。当然,本地 DNS 服务器也可以采用递归查询的方式,这取决于最初的查询请求报文的设置具体要求使用哪一种查询,递归查询的方式如下所示:

可以看到使用递归查询的方式我们依旧要使用 8 个 UDP 报文,但这种处理方式相对于前面的递归+迭代查询的组合会加大根 DNS 服务器的负荷,所以在实践中,查询通常采用递归(主机到本地 DNS)+迭代(本地 DNS 后续的查询)的方式。

2. DNS缓存

DNS 系统还有一个非常重要的特性:DNS缓存(DNS caching)。DNS缓存用来存放最近查询过的域名以及从何处会的域名映射信息的记录。DNS缓存的原理非常简单,在一个请求链中,当某 DNS 服务器接收一个 DNS 回答时,他能将该回答中的信息缓存在本地存储器中。例如上面查询 www.google.com 的 IP 地址的例子中,如果在不久前已经有用户查询过该域名了,那么本地 DNS 服务器就不必向根 DNS 服务器重新查询 www.google.com 的 IP 地址,而是直接把 DNS缓存中存放的上次查询结果(即 www.google.com 的IP地址)返回给用户。

通过这种方式,能够提高 DNS 查询效率并减轻根 DNS 服务器的符合和减少互联网上的 DNS 查询报文数量。但需要注意的是域名和 IP 地址的绑定并不是永久的(虽然并不经常改变),为了保持 DNS 缓存的正确性,DNS 服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。

所以维护一个本地 DNS 服务器还有一个好处就是能够提高 DNS 查询效率。例如在一个大学中,当很多的 DNS 查询都指向同一个域名时,可以加快查询效率以及减轻流量负担。


六、DNS记录 & 往DNS插入记录

1. DNS 资源记录

在分布式数据库结构中的所有 DNS 服务器里面存储的内容是资源记录(Resource Record,RR),RR 提供了主机名到 IP 地址的映射,它是一个包含下列字段的四元组:

(Name, Value, Type, TTL)

其中,TTL 表示该记录的生存时间,它决定了资源记录应但从缓存中删除的时间。Name 和 Value 的值取决于 Type,如下表所示:

Type 含义
A Name为主机名,Value为该主机名对应的IP地址。该资源记录提供了标准的主机名到IP地址的映射
NS Name为域,Value为知道如何获得该域IP地址的权威DNS服务器的主机名。该资源记录用于沿着查询链来路由DNS查询
CNAME Name为别名,Value为规范主机名。该资源记录能够向查询的主机提供一个主机名对应的规范主机名
MX Name为别名,Value为邮箱服务器的规范主机名。该资源记录允许邮件服务器主机名具有简单的别名

下面举几个例子来说明上述表格的类型,注意下列例子均忽略了四元组中的 TTL。

  • ( relay.bar.foo.com, 145.37.93.126, A ):类型为 A 的资源记录,表示主机名 relay.bar.foo.com 对应的 IP 地址为145.37.93.126。
  • ( foo.com, dns.foo.com, NS ):类型为 NS 的资源记录,dns.foo.com 为知道 foo.com 这个域IP地址的权威地址的主机名。
  • ( foo.com, reply.bar.foo.com, CNAME ):类型为 CNAME 的资源记录,foo.com 为 reply.bar.foo.com 的简单别名。
  • ( foo.com, mail.bar.foo.com, MX ):类型为 MX 的资源记录,foo.com 为 mail.bar.foo.com 这个邮件服务器的简单别名。

2. 在DNS数据库中插入记录

到目前为止,我们所介绍的都是如何向 DNS 服务器查询域名的 IP 地址,现在我们就来了解一下如何往 DNS 数据库中插入记录以便我们自己的域名能够被他人访问到。

例如我们现在要创建一个域名 marck.com。首先我们就要先向注册登记机构注册域名 marck.com。注册登记机构(registrar)是一个商业实体,它验证该域名的唯一性,将该域名输入 DNS 数据库,对提供的服务收取一定的费用。在互联网初期唯一的注册登记机构是 Network Solution,它独家经营对于 com、net 和 org 域名的注册。现如今注册登记机构已有多家,例如国内较为出名的腾讯、阿里等均有此项业务。

当我们向某注册登记机构注册域名 marck.com 时,需要向该机构提供基本和辅助权威 DNS 服务器的名字和 IP 地址。假定该名字和 IP 地址是 dns1.marck.com 和 dns2.marck.com 以及 222.222.222.1 和 222.222.222.2。该注册登记机构将确保这两个权威 DNS 服务器的一个类型 NS 和一个类型 A 的记录输入 TLD com 服务器。例如对于 dns1.marck.com 的基本权威服务器,该注册登记机构将下列两条资源记录插入该 DNS 系统中:

( marck.com, dns1.marck.com, NS )
( dns1.marck.com, 222.222.222.1, A )

注意上述的资源记录均忽略了 TTL。而在我们自己的权威 DNS 服务器中,里面记录的就是例如 www.marck.com 或 mail.marck.com 这些子域名所对应的 IP 地址,这些映射是由我们自己维护的。

在完成了上述步骤之后,人们就能够访问到我们的站点了。例如某人要访问 www.marck.com 这个Web站点,那么当他在浏览器输入URL之后,浏览器就会向本地 DNS 服务器发起查询请求,如果本地 DNS 没有缓存相关 IP 地址的话,就会向根 DNS 服务器发起查询,接着根 DNS 服务器就会告知本地 DNS 服务器应当向 TLD com 服务器查询。本地服务器接着联系 TLD com 服务器,TLD com 服务器包含前面列出的两条资源记录,因为注册登记机构已经将这些资源记录插入所有的 TLD com 服务器中了,于是 TLD com 服务器就会向本地 DNS 服务器告知接下来应该向 222.222.222.1 发送一个 DNS 查询,于是本地 DNS 服务器就能顺利地找到我们的权威 DNS 服务器了。


七、参考

  • 《计算机网络》

    • 第6章 应用层

      • 6.1 域名系统DNS
  • 《计算机网络:自顶向下方法》

    • 第2章 应用层

      • 2.5 DNS:因特网的目录服务

dns服务器理论基础知识

【应用层】DNS协议相关推荐

  1. 前端网络基础-应用层DNS协议

    目录 初识域名 正向解析和反向解析 DNS解析 主机本地hosts文件实现DNS解析 浏览器缓存实现DNS解析 本地DNS服务器实现DNS解析 域名的组成 DNS迭代解析 DNS递归解析 DNS协议 ...

  2. 【工具使用】应用层DNS协议工具---iodine

    0x01 iodine 工具介绍 iodine工具是基于C语言开发的,分为服务端程序 iodined 和 客户端 iodine,iodine支持 EDNS.base32.base64.base128等 ...

  3. 计算机网络应用层(二):DNS协议详解

    DNS协议详解 前言 DNS协议概述 DNS工作原理 DNS缓存 DNS记录和报文 资源记录 DNS报文 总结 前言 DNS是计算机网络中应用层的一个协议,可能很多同学碰到过DNS被劫持的情况,我们现 ...

  4. TCP/IP协议应用层之DNS协议

    为什么会有TCP/IP协议? 世界各地有各种各样的计算机,每台计算机装有不同的操作系统,这就会导致他们对同一种信息存在多种不同的表达方式,这就好比世界各地的人们会说不同的语言.我们使用互联网可以把不同 ...

  5. 使用Wireshark进行DNS协议解析

    " DNS协议格式解析及说明." DNS即域名系统(Domain Name System),是用来将域名与IP地址建立映射的协议,通过DNS协议,可以方便记忆. DNS可基于TCP ...

  6. 万字长文爆肝 DNS 协议!

    试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合. ...

  7. 协议森林13 9527 (DNS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 在周星驰的电影<唐伯虎点秋香>中,周星驰饰演的主角一进入华府,就被强制增加了一个代号9 ...

  8. TCP/IP协议基本概括+ARP协议详解+DNS协议详解---Linux学习笔记

    TCP/IP协议的体系结构: TCP/IP协议族四层模型和OSI七层模型 上层协议使用下层协议的服务,下层协议给上层协议提供一个接口. 四层模型中各个层次的作用和特点 上图说明: 最底层是数据链路层, ...

  9. 计算机网络 DNS协议 FTP DHCP

    1.DNS协议则是用来将域名转换为IP地址.DNS采用客户/服务器模型,协议运行在UDP上,使用53号端口. 从概念上可以将DNS分为3部分:层次域名空间,域名服务器和解析器. 层次域名空间:因特网采 ...

最新文章

  1. 【组队学习】【27期】李宏毅机器学习
  2. php session不生效_php 验证session无效问题解决办法
  3. Velocity 页面加减运算
  4. 用于MPEG视频流的使能服务质量中间件
  5. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
  6. 第 2 讲 初识 SLAM
  7. STM32开关总中断
  8. jmeter录制 过滤_jmeter脚本录制方法:
  9. 武汉大学计算机学院推免率,武汉大学保研率
  10. 如何解决Windows10系统空闲时间CPU占用高,风扇很响的问题?
  11. AutoCAD 2004-2022 官方简体中文版下载直链
  12. 登录计算机隐藏用户名,win10系统隐藏登录界面administrator用户名的办法介绍
  13. 数学建模算法与程序(司守奎):第一章 线性规划
  14. 肾虚的信号你明白嘛?
  15. 生成对角矩阵 numpy.diag
  16. 【明哥版】2020最新Android Studio Win10 安装教程
  17. 哈夫曼编码-Java实现
  18. 四边形顶点坐标排序十字分割法
  19. 免费内网穿透 对外一键发布网站 穿透80端口
  20. 十步杀一人,千里不留行 1

热门文章

  1. iOS编译cURL库并链接darwinssl,zlib,c-ares库操作步骤
  2. html鼠标手状态,css鼠标样式
  3. 跟网络游戏,手机APP游戏告别
  4. 【无标题】excel中query编辑器修改数据类型、第一行做标题、计算行数
  5. 摩尔纹的原理与产生条件
  6. #一日一图#谁来暖床!
  7. SSMS18.9.1证书被颁发者直接吊销
  8. java.lang.OutOfMemoryError: Java heap space
  9. LTE学习-OFDM
  10. 探索 Zynq MPSoC:配套 PYNQ 和机器学习应用一起使用 - 序言鸣谢目录20211231