0%

DNS学习

DNS为应用层协议,其下层为UDP

域名结构树👇

.image-20220321110814107

  • 根域名服务器(Root Server): .
  • 顶级域名服务器(Top Level Domain, TLD): 分为两个主要组
    • 通用顶级域:非特定国家/地区的域,最知名的通用 TLD 包括 com, org, net, edu, gov
    • 国家/地区顶级域:特定于某个国家/地区或州的域,如uk, us, ru, jp
  • 权威域名服务器(Authoritative): bilibili, qq, baidu

递归查询&迭代查询

.→com→server.com→www.server.com

  1. 客户端首先会询问本地服务器(客户端的设置中填写的DNS服务器地址),收到请求后从缓存里找,如果没有,会去问根服务器
  2. 如果没有缓存,本地服务器会去问根服务器,它会提供com顶级服务器的IP地址
  3. 本地服务器接着询问顶级服务器,获得了server.com的权威服务器的IP地址
  4. 本地服务器接着询问顶级服务器,获得了www.server.com的IP地址
  5. 本地服务器再将IP地址返回客户端,客户端和服务器建立连接

本地DNS服务器又叫做DNS解析器(resolver),因为它通过递归查询直接返回最终IP地址

递归查询:必须给出最终的IP地址,当缓存中没有最终IP时,需要亲自向能查询到最终结果的DNS服务器查询

迭代查询:不用给出最终的IP地址,当缓存中没有最终IP时,给出能查询到最终结果的DNS服务器地址

.image-20220325194831832

下图均为递归查询👇

.image-20220322110255876

Cloudflare的优质中文学习资源:https://www.cloudflare.com/zh-cn/learning/dns/what-is-dns/

更多云&网络相关的资源:https://www.cloudflare.com/zh-cn→入门→学习中心

DNS报文

DNS有查询响应两种报文

.image-20220325185407315

Flags👇

.image-20220325185635837

  • QR(Response): 标识报文类型:查询报文 QR = 0,响应报文 QR = 1

  • OpCode: 操作码,其中 0表示标准查询,1表示反向查询,2表示服务器状态请求

  • AA(Authoritative): 只在响应报文中有效, 表示响应服务器是否为权威服务器

  • TC(Truncated): 截断标志位,1表示响应已超过 512 字节并且已经被截断,只返回前 512 个字节

  • RD(Recursion Desired): 是否为递归查询,该标志在查询中设置,并在响应中返回

  • RA(Recursion Available): 只出现在响应报文中,表示服务器是否支持递归查询

  • Z(zero): 保留字段,在所有的请求和应答报文中,它的值必须为 0

  • AD: 表示信息是否是已授权

  • CD: 表示是否禁用安全检查

  • RCODE(Reply code):返回码标志,表示响应报文的状态

    0 表示没有错误

    1 表示报文格式错误(Format error),服务器不能理解请求的报文

    2 表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求

    3 表示名称错误(Name Error),意为解析的域名不存在,只对授权域名解析服务器有意义

    4 表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型

    5 表示拒绝(Refused),一般是由于服务器设置的策略拒绝给出应答

回答区域、授权区域、附加区域均由许多条RR组成

缓存经过TTL(Time to Leave)后会被清除,单位:秒

顶级服务器的缓存一般存放在本地服务器中,这样可以减少根服务器的负载

缓存是以资源记录(Resource Record, RR)的形式分布式存储在DNS中的(????)

RR

包括六个字段:Name, Type, Value, TTL, Class, Data length

  • A记录:A表示Address,保存域的 IPv4 地址

    Name Type Value TTL
    example.com A 192.0.2.1 14400(默认)

    绝大多数网站只有一个 A 记录,但可以有多个

    一些高流量的网站有数个不同的 A 记录,作为循环负载均衡技术的一部分,将请求流量分配到托管相同内容的多个 IP 地址中的一个

  • AAAA记录:保存域名的 IPv6 地址,其余与A记录相同

  • CNAME记录:C表示Canonical(规范的)

    当查询的域名是另一个域的别名时,会返回真正的域名

    别名一般直接指向真名,否则会降低效率

    Name Type Value TTL
    blog.example.com CNAME example.com 14400(默认)
  • NS记录:NS表示Name Server,指示哪个服务器含有对查询的域名的实际记录,通常会有多个NS记录

    NS记录不能指向CNAME记录

    Name Type Value TTL
    example.com NS ns1.exampleserver.com 21600

此外还有许多种RR类型,详见Cloudflare官网