第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的特点:

  1. 分布式

    • 不是一个地方存所有数据
    • 分布在很多服务器上
    • 可扩展
  2. 层次化

    • 域名是层次的
    • 从右到左越来越高级
    • 根 → 顶级域 → 二级域 → …
  3. 缓存

    • 查询结果缓存
    • 提高效率
    • 减少查询
  4. 冗余

    • 多个服务器
    • 一个挂了还有其他的

DNS是分布式、层次化的。


本章讨论的内容

本章讨论的内容:

  • DNS域名空间
  • DNS报文格式
  • 递归查询和迭代查询
  • DNS缓存
  • 反向查询
  • DNS服务器

本章介绍DNS协议。


14.2 DNS域名空间

域名的层次

域名的层次结构:

  • 从右到左
  • 点分隔
  • 最右边是顶级域

例子:www.baidu.com

  • 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(互联网)

常见查询类型:

类型说明
AIPv4地址
AAAAIPv6地址
NS域名服务器
CNAME规范名
MX邮件交换
PTR指针(反向查询)
TXT文本
SOA起始授权
ANY所有类型

问题部分包含查询的内容。


资源记录

资源记录(RR, Resource Record):

  • 答案、授权、附加部分都是RR
  • 格式一样

RR格式:

  • 域名:查询的域名
  • 类型:记录类型
  • 类:通常IN
  • TTL:生存时间,缓存多久
  • 数据长度:数据的长度
  • 数据:具体数据

资源记录是DNS的基本数据单元。


14.4 DNS查询

两种查询方式

两种查询方式:

  1. 递归查询(Recursive Query)

    • 服务器替你查
    • 查完给你最终结果
    • 客户端简单
    • 服务器负担重
  2. 迭代查询(Iterative Query)

    • 服务器告诉你下一步问谁
    • 你自己去问下一个
    • 客户端复杂
    • 服务器负担轻

递归和迭代两种查询方式。


递归查询

递归查询过程:

  1. 客户端问本地DNS服务器

  2. 本地DNS服务器替客户端查

    • 从根开始查
    • 一步步查下来
    • 查到最终结果
  3. 本地DNS服务器把结果给客户端

    • 给你,这是IP

特点:

  • 客户端简单,只问一次
  • 服务器要做所有工作
  • 通常客户端到本地DNS是递归

递归查询服务器替你查完。


迭代查询

迭代查询过程:

  1. 本地DNS问根服务器

  2. 本地DNS问com服务器

  3. 本地DNS问baidu.com服务器

  4. 本地DNS拿到结果

特点:

  • 每次问一个
  • 服务器告诉你下一步问谁
  • 通常DNS服务器之间是迭代

迭代查询告诉你下一步问谁。


典型的查询过程

典型的DNS查询过程:

客户端 → 本地DNS服务器(递归)
本地DNS → 根服务器(迭代)
根 → 返回com服务器地址
本地DNS → com服务器(迭代)
com → 返回baidu.com服务器地址
本地DNS → baidu.com服务器(迭代)
baidu → 返回www.baidu.com的IP
本地DNS → 客户端(最终结果)

客户端到本地是递归,服务器之间是迭代。


14.5 DNS缓存

缓存的作用

DNS缓存的作用:

  • 不用每次都从根查起
  • 提高查询速度
  • 减少网络流量
  • 减轻根服务器压力

缓存提高效率。


缓存的位置

缓存的位置:

  1. 本地DNS服务器缓存

    • 查过的都缓存
    • 下次直接用
    • 最主要的缓存
  2. 操作系统缓存

    • 系统也会缓存
    • 不用每次都问DNS
  3. 应用程序缓存

    • 有些应用自己缓存
    • 比如浏览器

多层缓存。


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服务器类型:

  1. 根域名服务器

    • 最顶层
    • 知道顶级域的服务器
    • 全球13组
  2. 顶级域服务器

    • 管理一个顶级域
    • 比如com的服务器
    • 知道二级域的服务器
  3. 权威域名服务器

    • 管理一个域
    • 比如baidu.com的服务器
    • 有这个域的所有数据
  4. 本地域名服务器

    • 也叫递归服务器
    • 替客户端查询
    • 缓存结果
    • 比如运营商的DNS

有不同类型的DNS服务器。


权威服务器

权威服务器(Authoritative):

  • 有这个域的原始数据
  • 回答是权威的
  • AA位为1

主从服务器:

  • 主服务器:原始数据
  • 从服务器:从主服务器同步
  • 冗余和负载均衡

权威服务器有原始数据。


递归服务器

递归服务器(Recursive):

  • 也叫缓存服务器
  • 替客户端查
  • 缓存结果
  • 自己没有原始数据
  • 比如8.8.8.8(Google DNS)

递归服务器替客户端查询。


14.8 小结

DNS概述

  1. 作用

    • 域名系统
    • 域名 ↔ IP
  2. 特点

    • 分布式
    • 层次化
    • 缓存
    • 冗余

域名空间

  1. 层次结构

    • 根 → 顶级域 → 二级域 → …
    • 从右到左
  2. 根域

    • 最顶层
    • 13组根服务器
  3. 顶级域

    • 通用、国家、新通用
  4. FQDN

    • 完全限定域名
    • 完整路径

报文格式

  1. 五部分

    • 首部、问题、答案、授权、附加
  2. 首部

    • 12字节
    • 标识、QR、Opcode、各种标志
    • 各部分数量
  3. 问题部分

    • 查询名、类型、类
  4. 资源记录

    • 答案/授权/附加都是RR
    • 类型、TTL、数据

查询方式

  1. 递归查询

    • 服务器替你查完
    • 客户端简单
    • 客户端→本地DNS
  2. 迭代查询

    • 告诉你下一步问谁
    • 客户端复杂
    • DNS服务器之间
  3. 典型过程

    • 客户端→本地(递归)
    • 本地→根→顶级→权威(迭代)

DNS缓存

  1. 作用

    • 提高速度
    • 减少查询
  2. 位置

    • 本地DNS服务器
    • 操作系统
    • 应用程序
  3. TTL

    • 生存时间
    • 控制缓存时间

反向查询

  1. 什么是反向查询

    • IP → 域名
    • PTR记录
  2. 实现

    • in-addr.arpa
    • IP反过来

DNS服务器

  1. 类型

    • 根服务器
    • 顶级域服务器
    • 权威服务器
    • 本地/递归服务器
  2. 权威服务器

    • 有原始数据
    • 主从结构
  3. 递归服务器

    • 替客户端查
    • 缓存结果

关键概念

  1. DNS

    • 域名系统
    • 分布式层次化
  2. 递归 vs 迭代

    • 递归:替你查完
    • 迭代:告诉你问谁
  3. 缓存

    • 提高效率
    • TTL控制
  4. 反向查询

    • IP→域名
    • in-addr.arpa
  5. 服务器类型

    • 根、顶级、权威、递归

DNS域名系统