第14章 DNS:域名系统
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍DNS协议,包括DNS的作用、域名空间、报文格式、查询方式和高速缓存等。
14.1 引言
DNS的作用
DNS(Domain Name System):
- 域名系统
- 把域名转换成IP地址
- 也可以反向,IP转域名
- 分布式数据库
- 应用层协议
DNS把域名解析成IP地址。
为什么需要DNS
为什么需要DNS:
- IP地址不好记
- 域名好记
- 需要一个系统把域名转成IP
- 而且要分布式,可扩展
没有DNS会怎样:
- 只能记IP地址
- 很难记
- IP变了就找不到了
DNS让我们能用好记的域名。
DNS的特点
DNS的特点:
-
分布式
- 不是一个地方存所有数据
- 分布在很多服务器上
- 可扩展
-
层次化
- 域名是层次的
- 从右到左越来越高级
- 根 → 顶级域 → 二级域 → …
-
缓存
- 查询结果缓存
- 提高效率
- 减少查询
-
冗余
- 多个服务器
- 一个挂了还有其他的
DNS是分布式、层次化的。
本章讨论的内容
本章讨论的内容:
- DNS域名空间
- DNS报文格式
- 递归查询和迭代查询
- DNS缓存
- 反向查询
- DNS服务器
本章介绍DNS协议。
14.2 DNS域名空间
域名的层次
域名的层次结构:
- 从右到左
- 点分隔
- 最右边是顶级域
- com:顶级域
- baidu:二级域
- www:三级域(主机名)
域名是层次化的。
根域
根域(Root):
- 最顶层
- 用点表示
- 根域名服务器
- 全球13组根服务器
根服务器:
- A到M,13组
- 每组有很多镜像
- 全球分布
- 知道所有顶级域的服务器
根是最顶层。
顶级域
顶级域(TLD, Top Level Domain):
- 根下面的一级
- 分为几类:
常见顶级域:
| 类型 | 例子 | 说明 |
|---|---|---|
| 通用顶级域 | com, org, net, edu, gov | 通用用途 |
| 国家顶级域 | cn, us, jp, uk | 国家/地区 |
| 新通用顶级域 | xyz, online, shop | 新的 |
顶级域有很多种。
二级域及以下
二级域:
- 顶级域下面
- 比如baidu.com
- 通常是一个组织的域名
三级及以下:
- 二级域下面
- 比如www.baidu.com
- 可以有很多级
- 由组织自己管理
下面的层级由组织自己管理。
完全限定域名
完全限定域名(FQDN, Fully Qualified Domain Name):
- 完整的域名
- 最后有个点
- 比如www.baidu.com.
- 表示从根开始的完整路径
为什么:
- 明确是完整的
- 不是相对的
FQDN是完整的域名。
14.3 DNS报文格式
DNS报文格式
DNS报文格式:
+-------------------+
| 首部 | 12字节
+-------------------+
| 问题 | 查询的问题
+-------------------+
| 答案 | 答案记录
+-------------------+
| 授权 | 授权服务器
+-------------------+
| 附加 | 附加信息
+-------------------+
DNS报文有五个部分。
DNS首部
DNS首部(12字节):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 标识 |QR| Opcode |AA|TC|RD|RA| Z |RCODE|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 问题数 | 答案数 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 授权数 | 附加数 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
首部字段:
- 标识:16位,匹配请求和响应
- QR:1位,0=查询,1=响应
- Opcode:4位,操作类型,0=标准查询
- AA:1位,权威回答
- TC:1位,截断
- RD:1位,期望递归
- RA:1位,可用递归
- Z:3位,保留
- RCODE:4位,响应码,0=无错误
- 问题数:16位,问题部分的数量
- 答案数:16位,答案部分的数量
- 授权数:16位,授权部分的数量
- 附加数:16位,附加部分的数量
DNS首部12字节,有很多字段。
问题部分
问题部分:
- 查询的问题
- 包含:
- 查询名:要查的域名
- 查询类型:A, MX, NS等
- 查询类:通常是IN(互联网)
常见查询类型:
| 类型 | 说明 |
|---|---|
| A | IPv4地址 |
| AAAA | IPv6地址 |
| NS | 域名服务器 |
| CNAME | 规范名 |
| MX | 邮件交换 |
| PTR | 指针(反向查询) |
| TXT | 文本 |
| SOA | 起始授权 |
| ANY | 所有类型 |
问题部分包含查询的内容。
资源记录
资源记录(RR, Resource Record):
- 答案、授权、附加部分都是RR
- 格式一样
RR格式:
- 域名:查询的域名
- 类型:记录类型
- 类:通常IN
- TTL:生存时间,缓存多久
- 数据长度:数据的长度
- 数据:具体数据
资源记录是DNS的基本数据单元。
14.4 DNS查询
两种查询方式
两种查询方式:
-
递归查询(Recursive Query)
- 服务器替你查
- 查完给你最终结果
- 客户端简单
- 服务器负担重
-
迭代查询(Iterative Query)
- 服务器告诉你下一步问谁
- 你自己去问下一个
- 客户端复杂
- 服务器负担轻
递归和迭代两种查询方式。
递归查询
递归查询过程:
-
客户端问本地DNS服务器
-
本地DNS服务器替客户端查
- 从根开始查
- 一步步查下来
- 查到最终结果
-
本地DNS服务器把结果给客户端
- 给你,这是IP
特点:
- 客户端简单,只问一次
- 服务器要做所有工作
- 通常客户端到本地DNS是递归
递归查询服务器替你查完。
迭代查询
迭代查询过程:
-
本地DNS问根服务器
- www.baidu.com的IP是多少?
- 根服务器:我不知道,你去问com的服务器
-
本地DNS问com服务器
- www.baidu.com的IP是多少?
- com服务器:我不知道,你去问baidu.com的服务器
-
本地DNS问baidu.com服务器
- www.baidu.com的IP是多少?
- baidu服务器:是x.x.x.x
-
本地DNS拿到结果
特点:
- 每次问一个
- 服务器告诉你下一步问谁
- 通常DNS服务器之间是迭代
迭代查询告诉你下一步问谁。
典型的查询过程
典型的DNS查询过程:
客户端 → 本地DNS服务器(递归)
本地DNS → 根服务器(迭代)
根 → 返回com服务器地址
本地DNS → com服务器(迭代)
com → 返回baidu.com服务器地址
本地DNS → baidu.com服务器(迭代)
baidu → 返回www.baidu.com的IP
本地DNS → 客户端(最终结果)
客户端到本地是递归,服务器之间是迭代。
14.5 DNS缓存
缓存的作用
DNS缓存的作用:
- 不用每次都从根查起
- 提高查询速度
- 减少网络流量
- 减轻根服务器压力
缓存提高效率。
缓存的位置
缓存的位置:
-
本地DNS服务器缓存
- 查过的都缓存
- 下次直接用
- 最主要的缓存
-
操作系统缓存
- 系统也会缓存
- 不用每次都问DNS
-
应用程序缓存
- 有些应用自己缓存
- 比如浏览器
多层缓存。
TTL
TTL(Time To Live):
- 生存时间
- 缓存可以存多久
- 秒为单位
- 过期了就重新查
为什么需要TTL:
- 记录可能会变
- 不能永久缓存
- 过期了重新查保证正确性
TTL控制缓存时间。
缓存的优缺点
优点:
- 快
- 减少查询
- 减轻服务器压力
缺点:
- 数据可能不是最新的
- 更改后要等TTL过期才生效
- 缓存污染的风险
缓存有好有坏。
14.6 反向查询
什么是反向查询
反向查询(Reverse DNS):
- 正向:域名 → IP
- 反向:IP → 域名
- 用PTR记录
为什么需要反向查询:
- 日志里显示域名
- 反垃圾邮件
- 身份验证
- 等等
反向查询IP转域名。
反向查询的实现
反向查询的实现:
- 用特殊的域名
- in-addr.arpa
- IP反过来加.in-addr.arpa
例子:
- IP:192.168.1.1
- 反向查询:1.1.168.192.in-addr.arpa
- 查PTR记录
反向查询用in-addr.arpa域。
14.7 DNS服务器
DNS服务器类型
DNS服务器类型:
-
根域名服务器
- 最顶层
- 知道顶级域的服务器
- 全球13组
-
顶级域服务器
- 管理一个顶级域
- 比如com的服务器
- 知道二级域的服务器
-
权威域名服务器
- 管理一个域
- 比如baidu.com的服务器
- 有这个域的所有数据
-
本地域名服务器
- 也叫递归服务器
- 替客户端查询
- 缓存结果
- 比如运营商的DNS
有不同类型的DNS服务器。
权威服务器
权威服务器(Authoritative):
- 有这个域的原始数据
- 回答是权威的
- AA位为1
主从服务器:
- 主服务器:原始数据
- 从服务器:从主服务器同步
- 冗余和负载均衡
权威服务器有原始数据。
递归服务器
递归服务器(Recursive):
- 也叫缓存服务器
- 替客户端查
- 缓存结果
- 自己没有原始数据
- 比如8.8.8.8(Google DNS)
递归服务器替客户端查询。
14.8 小结
DNS概述
-
作用
- 域名系统
- 域名 ↔ IP
-
特点
- 分布式
- 层次化
- 缓存
- 冗余
域名空间
-
层次结构
- 根 → 顶级域 → 二级域 → …
- 从右到左
-
根域
- 最顶层
- 13组根服务器
-
顶级域
- 通用、国家、新通用
-
FQDN
- 完全限定域名
- 完整路径
报文格式
-
五部分
- 首部、问题、答案、授权、附加
-
首部
- 12字节
- 标识、QR、Opcode、各种标志
- 各部分数量
-
问题部分
- 查询名、类型、类
-
资源记录
- 答案/授权/附加都是RR
- 类型、TTL、数据
查询方式
-
递归查询
- 服务器替你查完
- 客户端简单
- 客户端→本地DNS
-
迭代查询
- 告诉你下一步问谁
- 客户端复杂
- DNS服务器之间
-
典型过程
- 客户端→本地(递归)
- 本地→根→顶级→权威(迭代)
DNS缓存
-
作用
- 提高速度
- 减少查询
-
位置
- 本地DNS服务器
- 操作系统
- 应用程序
-
TTL
- 生存时间
- 控制缓存时间
反向查询
-
什么是反向查询
- IP → 域名
- PTR记录
-
实现
- in-addr.arpa
- IP反过来
DNS服务器
-
类型
- 根服务器
- 顶级域服务器
- 权威服务器
- 本地/递归服务器
-
权威服务器
- 有原始数据
- 主从结构
-
递归服务器
- 替客户端查
- 缓存结果
关键概念
-
DNS
- 域名系统
- 分布式层次化
-
递归 vs 迭代
- 递归:替你查完
- 迭代:告诉你问谁
-
缓存
- 提高效率
- TTL控制
-
反向查询
- IP→域名
- in-addr.arpa
-
服务器类型
- 根、顶级、权威、递归