《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统
引言
到目前为止,我们使用 IP 地址来研究参与网络的主机。对于大众来说,这些地址太繁琐且难以记忆。为了使用如 TCP 和 IP 等协议,主机名称通过名为名称解析(name resolution)的过程转换成 IP 地址。在互联网中,存在着不同形式的名称解析,其中最普遍、最重要的是域名系统(Domain Name System,DNS)。
DNS 是一种分布式数据库系统,是一种典型的客户端/服务器模型的网络数据库。TCP/IP 应用程序使用它来完成主机名称和 IP 地址的映射。“分布式”是指在互联网中,没有一个站点可以保存所有的信息,而是有许许多多的站点(学校、公司、部门等等)都维护自己的信息数据库,运行一个服务器程序以供互联网上的其他系统查询。DNS 提供了客户端和服务器之间、服务器和服务器之间通信的协议。
DNS 作为互联网上的应用程序运行,是一个应用层设计。从别的应用程序的角度看,访问 DNS 是通过一个称为地址解析器(resolver)的程序来完成的。而TCP/IP 协议对 DNS 的存在一无所知,它们只对网络地址进行操作。
为了实现可扩展性,DNS 名称是分层的。我们将了解 DNS 名称空间,地址解析器、服务器如何使用 DNS 协议进行通信,以及 DNS 如何为普通用户所用。
DNS 名称空间
DNS 中所有使用的名称构成了 DNS 名称空间(name space)。名称空间和计算机系统的文件系统相似,都是划分为层次且大小写不敏感的。DNS 名称空间是一棵域名树。
- 位于顶部的树根未命名。
- 树的最高层是所谓的顶级域名(Top-Level Domain Name,
TLD
)。包括通用顶级域名(generic,gTLD
)、国家代码顶级域名(country code,ccTLD
)、国际化国家代码顶级域名(internationalized,IDN ccTLD),基础设施顶级域名(infrastructure TLD)等等。 - 国际化域名 IDN 的历史是互联网国际化的一部分,漫长而复杂。
- gTLD 分为几类:通用、通用限制、赞助。通用 gTLD 是开放的,其他两类受限于各种适用类型,以及什么实体可以从域名中分配名称。
- ccTLD 包含 ISO 3166 标准中指定的两个字母的国家代码。
- TLD 管理相关政策一般由 ICANN(互联网名称和号码分配机构)负责。
命名语法
域名树的 TLD 下面的名称进一步划分,称为子域名(subdomain)。
例如,英国大部分教育站点使用后缀.ac.uk
,而大多数盈利机构以后缀.co.uk
结尾。美国市政府的站点使用子域名ci.city.state.us
,city 是城市的名称,state 是州名的两个字母缩写。例如www.ci.manhatan-beach.ca.us
是加州曼哈顿海滩市的站点。
域名又分为完全限定域名(FQDN)和非限定域名(unqualified domain name)两种。前者书写为带有后随点的形式,例如mit.edu.
,代表该名称是完整的,进行名称解析时,不会再添加额外的信息。
与此相对的就是非限定域名,域名解析时,会有字符串添加到尾部。例如,当配置系统时,使用 DHCP ,指定一个默认域名扩展和搜索列表。例如,默认域名为can.berkeley.edu
在伯克利计算机系的系统中配置,这些机器上的用户输入名称vangogh
,解析器就会将名称转换为vangogh.cs.berkeley.edu
,解析器根据这个来找vangogh
的地址。
一个域名包含一系列由点分开的标签(label)。每个标签代表域名树层级中的一个位置。点就是层次结构的分割,按照名称从右到左的顺序沿树下降。例如:www.net.in.tum.de.表示包含在一个 4 级深度域名
net.in.tum.de的主机名
www`。
- TLD 是 de,是德国的 ccTLD。
- tum 是 Technische UNiversitat Munchen 的缩写
- in 是 informatik (德语计算机科学)的缩写
- net 是计算机学科中网络组缩写。
标签是大小写不敏感的。
名称服务器和区域
DNS 命名空间的层次结构运行不同的管理机构管理名称空间的不同部分。例如,创建一个新的 DNS 名称elevator.cs.berkeley.edu
只需与cs.berkeley.edu
的子域拥有者协商即可。DNS 的这个特点是它可扩展性的保证,没有一个单一中心化实体必须管理整个 DNS 名称空间的所有变化。
部分(也通常是次级) DNS 名称空间的管理责任分配给了组织或个人。这些组织和个人至少安置两台名称服务器(name server)或者DNS 服务器(DNS server)来存储相关信息,提供给互联网用户查询名称。因为服务器的集合构成了 DNS 服务的核心本身,所以我们说DNS 是一个分布式系统。这个分布式系统的主要工作是提供名称到地址的映射,也可以提供额外的广泛信息。
在 DNS 的语境中,管理授权的单位是区域(zone)。
介绍并区分两个术语:
- 所有域名的集合:
namespace
- 管理授权的单位:
zone
可以理解为一个区域就是 DNS 命名空间中的一棵子树。即使是 TLD 也是在 root zone 中。每当一条新纪录添加到 zone 中,该 zone 管理员将新建一条新条目,保存名称和 IP 地址的映射,添加到服务器的数据库中。
一台 DNS 服务器可以提供多个区域的信息。在一个域名的任何层次变化点上,不同的区域和包含的服务器可能被访问,以提供该名称的地址。这称为授权(delegation)。例如在 berkeley.edu
中可能存在主机www.berkeley.edu
,也可能存在其他的域cs.berkeley.edu
。每一个区域都有一个负责方或者管理者,拥有管理名称、地址、该区域下属区域的权利。不仅管理区域的内容,也管理区域数据库、各种服务器。
区域信息最少应存在两个地方,这样做是为了如果有一台服务器不能工作,至少有另一台可以使用。这叫做主服务器和辅助服务器之间的区域传输(zone transfer)进程。
DNS 缓存
名称服务器包含名称到 IP 地址的映射信息。这些信息可以来自三个途径:
- 直接来自于区域数据库。在这种情况下,服务器应该包含该区域的授权信息(authoritative information),服务器可以被称为该区域的授权服务器(authoritative server),这样的服务器能通过区域内的鉴别。
- 从一个从属服务器区域传输的结果。
- 来自处于解析过程中的另一台服务器。
大部分名称服务器会缓存(cache)它们学习的区域信息,直到一个时间限制(TTL)为止。用缓存的信息来响应查询请求,可以大大减少 DNS 消息流量和响应时间。当应答查询时,服务器指明这条消息是来自缓存、还是区域的授权副本。
缓存同时适用成功的解析和不成功的解析。(否定缓存,negative caching)如果对一个特定域名的请求无法返回一个记录,则该事实也会被缓存。这样,再次请求同一不存在的域名时,就可以帮助降低互联网流量。
DNS 协议
DNS 协议由两个主要部分组成。
- DNS 特定名称的查询/响应报文协议。(最典型的用法)
- 名称服务器用于交换数据库的区域传输协议。分为 DNS 通知和动态更新。
通过每个站点或是 ISP 本地部署服务器和一组特殊的根服务器(root server)构成 DNS 分布式基础设施,通过该基础设施支持 DNS 查询/响应。
截止 2011 年,共有 13 台由字母 A 到 M 命名的根服务器。13 台 gTLD 服务器,也由 A 到 M 标示。通过联系根服务器和 gTLD 服务器,互联网中任何用 TLD 格式名称的主机、服务器,都可以被发现。
对于 UDP 和 TCP 来说,DNS 的知名端口号是 53。
例子
下列序号是图中的箭头上的消息序号:
- 当笔记本电脑 A.HOME 需要进行域名解析时,电脑上的解析器先朝最接近的本地名称服务器发送请求。也就是(消息1)。
- 如果本地的域名服务器不清楚此域名对应的 IP,它就会将查询转发至另一个服务器(也就是递归)。(消息2)前往 ISP 提供的 DNS 服务器。
- ISP DNS 服务器也不清楚的话,就联系根服务器中的一台。
- 根服务器不是递归的,它们不会再进一步朝别的服务器请求,而是返回需要联系的正确的服务器的信息。
- 根据这些信息,ISP DNS 联系一个 gTLD 服务器。
- 这个 gTLD 服务器发现了对应的名称服务器的 IP 地址,通过消息6返回。
- 基于消息6,ISP DNS 联系适当的服务器。
- 该服务器回复请求的 IP地址
- ISP DNS 返回给本地名称服务器。
- 本地名称服务器返回给笔记本电脑。
DNS 消息格式
字段 | 长度(bits) | 含义 |
---|---|---|
事务ID | 16 | 由客户端设置,服务器来返回,用来匹配响应和查询 |
QR | 1 | QR = 0表示查询,QR = 1表示响应 |
OpCode | 4 | 有三种值,0:标准查询,4:通知(NOTIFY),5:更新(UPDATE) |
Flag | 7 | 查看下文 |
RCODE | 4 | 是一个响应码,常用的值有0:没有差错;3:不存在域名 等 |
查询数、区域数 | 16 | 这接下来4条的字段都是16bits,表示DNS消息中各个区段(问题、回答、授权、额外信息)的条目数量。 |
回答数、先决条件数 | 16 | 查看下文 |
授权记录数 | 16 | 查看下文 |
额外信息数 | 16 | 查看下文 |
区段 | 可变长度 | DNS消息最后的部分。第一个区段指示类型,后续的区段都可以包含资源记录(resource record,RR)。RR可以被缓存,而问题则不可以。 |
标志
一共7个标志,每一个 1bit。
标志名 | 意义 |
---|---|
AA | Authoritative answer,指示希望的是授权信息,还是缓存里的信息也可以。 |
TC | Truncated,截断信息,表示当应答超过512字节时,只发送前512字节 |
RD | Recursion desired,告诉服务器希望执行递归查询 |
RA | Recursion availabe,服务器表明自己是可以递归查询的。根服务器就不是递归的 |
Z | 0 |
AD | 如果包含信息是授权信息,设置这一位 |
CD | 禁止校验 |
区段
接下来先讲标准查询。
区段是DNS消息最后的部分,有问题、回答、授权、额外信息四个种类。问题是 query 包里的,其余三个是 response 包的。在区段的前面四个16bits的字段就是对应这四个区段的条目数。对于 query 包来说,查询数就是1,其余三个的数量就是0。对于 response 包来说,回答数至少为 1,有可能包含其他信息。
问题区段格式
问题区段有名称、类型、类,见下图。
字段 | 长度(bits) | 含义 |
---|---|---|
查询名称 | 可变,但需要填充字节 | 需要被查询的域名,使用一种标签编码,见下文 |
查询类型(Types) | 16 | 查询哪种类型的资源记录,见下文“资源记录类型” |
查询类(Class) | 16 | 1:互联网类,254:没有类,255:所有类 |
下图是 DNS 系统中表示一个域名的编码——标签。一个标签就是一个完整的域名。对于一个标签来说,首先是用标签长度来指示后面跟了几个字符。0 表示一个标签的结束。每个标签的长度是 0 到 63。
如果使用普通的数据标签,如果在一次查询中出现了相同的名称,DNS 消息中的相同字符会重复。例如在一次查询中需要查询usc.edu
和ucla.edu
,如果使用上面的普通编码方式,edu
这个字符会重复出现在消息内容中。下图是压缩标签,通过引用其他标签从而节省空间。普通的数据标签的开头是用一个字节的数字来表示后续的字符数量的。而压缩标签的用法是:开头用两个字节,共16bits,头两个bits置1,然后后续的14个bit形成一个偏移量指针,偏移量指示的是距离此消息开头的字节数。在查询usc.edu
和ucla.edu
时,后面的edu
用偏移量 4 表示,就可以省下空间,见下图:
回答、授权、额外信息区段格式
除了问题区段,其他的区段包含零个或多个资源记录,RR。RR有固定的格式,见下图。
字段 | 长度(bits) | 含义 |
---|---|---|
名称 | 可变,需要填充 | 就是域名 |
查询类型Type | 16 | 见下文“资源记录类型” |
查询类Class | 16 | 同问题的区段。1:互联网类,254:没有类,255:所有类 |
TTL | 16 | 缓存时间(秒) |
RDLENGTH | 16 | 资源数据长度(bytes) |
RDATA | 16 | 资源数据,根据查询类型的不同这里回放不同的东西 |
资源记录类型
虽然 DNS 常用来确定特定的名称对应的 IP 地址,但是它可以用于相反的目的(根据IP查域名),也经常用来查一些别的。这是由于 DNS 能够拥有很多类型的资源记录,DNS 甚至可以为非互联网数据提供分布式数据库功能。
资源记录分为三大类:
- 数据类型。传达 DNS 中存储的信息。
- 查询类型。使用和数据类型相同的值,增加几个额外的值,在问题区段中使用。
- 元类型,特定单一 DNS 消息相关联的临时数据。
上图黄色标出了常用的资源记录类型。例如,一个 query 包里的问题区段的查询类型Type字段的值是 A
,意味着需要查询一个对应域名的 IPv4 地址。
A
:IPv4 地址NS
:区域授权服务器的名称,以供查询使用CNAME
:规范名称,也就是提供别名AAAA
:IPv6 地址
区域传输 和 DNS 通知
区域传输是用于从一个服务器复制另一区域的一组 RR 的,通常是主服务器复制到从服务器。这个功能的目的是为了保持多台服务器的内容同步。如果一台服务器失效了,这个功能也能让其他服务器帮助它恢复。与这个功能有关的字段是OpCode
中的DNS NOTIFY
值。由于数据量很大,这会使用TCP协议。
总结
DNS 是互联网的一个重要组成部分,也同时广泛地应用于私有网络中。DNS 名称空间是全世界范围的。应用程序使用解析器联系一个或多个 DNS 服务器,执行域名解析。解析器联系一个本地域名服务器,该服务器可能会递归地联系其他满足该请求的服务器。大多数 DNS 服务器会缓存知道的信息。DNS 协议被用于 DNS 查询、响应,区域交换。DNS 查询、响应由通用的消息格式,包括问题、回答、授权信息、额外信息等。资源记录用来保存大多数 DNS 信息。
DNS 一直受到众多攻击。例如伟光正的域名污染。
- DOS攻击,使重要的 DNS 过载,不能提供服务。
- 改变资源记录的内容,或者伪造成合法的 DNS 地址,但是回复假的资源记录,从而导致主机连接到错误的 IP 地址。也就是域名污染。
- 攻击者使用伪造的 IP 源地址产生对于 MX 记录的 DNS 请求。请求是较小的数据分组,但响应流量大(放大攻击,amplification)。响应会定向到请求的源 IP 地址。
- 域名污染的另一种形式——缓存中毒(cache poisoning),在这种攻击中,一台 DNS 服务器的缓存内容被错误的、伪造的数据替代。客户端被定向到伪服务器,若由别有用心的人将服务器故意配置成原来的模样,例如伪装成银行的 Web 洁面,用户可能会无意识泄露敏感信息。
《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统的更多相关文章
- 【TCP/IP详解 卷一:协议】第二章:链路层
2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...
- tcp/ip详解 卷1 -- 协议概述
第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...
- 《TCP/IP详解 卷1:协议》读书笔记
第一章 概述 协议栈 应用层 HTTP,FTP 运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层 帧(Frame) 物理 ...
- 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...
- TCP/IP详解 卷1 第十九章 TCP的交互数据流
19.1 引言 成块数据:比如ftp.电子邮件.Usenet新闻 交互数据:Telnet.Rlogin 成块数据的报文段基本上都是满长度(full-size)的,而交互数据小的多(Telnet和Rlo ...
- 《TCP/IP详解卷1:协议》第1章 概述-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第2章 链路层-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
随机推荐
- Bugku Writeup —文件上传2(湖湘杯)
我们先来看下题目,题目说明是文件上传 我们可以尝试通过构造payload来进行测试 php://filter/read=convert.base64-encode/resource=flag 获取到f ...
- scala集合与java集合的转换应用
今天在业务开发中遇到需要Scala集合转为Java集合的场景: 因为业务全部是由Scala开发,但是也避免不了调用Java方法的场景,所以将此记录下来加深记忆: import scala.collec ...
- python 集合总结
''' 集合:1:他是无序的,他是不重复的. 2,他里面的元素必须是可哈希的. int str bool ()但是它本身是不可哈希的. 3,集合不能更改里面的元素. 4,集合可以求交集,并集,差集,反 ...
- 20155238 2016-2017-2 《Java程序设计》第二周学习总结
教材学习内容总结 java基本类型:整数,字节,浮点数,字符 //"单行批注" */"单行批注" 变量 "驼峰式命命法" int age0f ...
- P4198 楼房重建
P4198 楼房重建 集中写博客= = 首先把高度变成斜率 然后就比较玄学了,首先用线段树维护一个区间的斜率最大值,和只看这个区间时能看见的楼房个数ans 然后更新时先更新max,再处理神奇的ans ...
- 日志模块logging介绍
一.日志的级别 日志一般分为5个级别,分别如下: CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INF ...
- 【PaPaPa】实现缓存决策 - 让你的缓存变的有智慧
我有话说 本来这一篇我打算放到后面再说,可是之前泄漏了一点关于缓存决策的代码后被好多人催更了. 在此感谢大家的支持,让我更有动力的写这个系列.你们的关注让我觉得我的决定是对的,我会坚持下去把这个项目做 ...
- 发现一个很N且免费的html5拓扑图 关系图 生成组件
传送门:http://visjs.org/ demo代码 <!doctype html> <html> <head> <title>vis.js new ...
- Effective C++(Third Edition) Item29 为“异常安全”而努力是值得的
“异常安全”有两个条件: 1.不泄露任何资源 可以通过以对象管理资源的方式(Item13). 2.不允许数据败坏 异常安全函数提供以下三种保证之一 a.基本承诺 如果异常被抛出,程序内的任何事物都仍然 ...
- oracle 数据库的详细安装教程
由于oracle数据库比较大 所以安装的时候比较慢是目前装的最大的软件了吧 而且如果装崩了 可能还会重装系统 不过比较幸运 一次就装好 1.需要去官网下载 https://www.oracle.co ...