# DNS

:域名系统(Domain Name System)协议,用于将域名解析到对应的 IP 地址。

  • 属于应用层协议,基于 UDP 通信,默认使用 53 端口。

# 域名

  • 域名(Domain name ,DN)是一个字符串,映射到一个 IP 地址,相当于该 IP 地址的别名。

    • 使用 IP 可以定位一个主机,但是 IP 不方便记忆,因此 1980 年代发明了域名。
    • 一个域名可以映射到多个 IP ,一个 IP 可以被多个域名映射。
    • 例:用户在浏览器中输入域名 baidu.com 或其对应的 IP ,都可以访问百度网站。
      • 但计算机必须先在本机解析出域名对应的 IP ,才能进行基于 IP 协议的 TCP 通信。
    • 用户可以找某个域名服务商购买一个域名,配置 DNS 解析规则。
  • 域名的格式为 xx[.xx]... ,由多个字段组成,字段之间用点号分隔。

    • 只能包含小写字母、数字、连字符 - ,有的情况会包含下划线 _ 。
    • 国际化域名(Internationalized Domain Name ,IDN)支持使用 Unicode 字符,以 ASCII 码存储。
  • 域名中的各个字段像目录路径一样划分层级,不过方向是从右向左,级别递减。

    • 所有域名从根域名 . 开始。
      • 根域名通常可以省略。例如域名 baidu.com. 通常简写为 baidu.com
      • 美国 ICANN 组织管理根域名,有权分配顶级域名。
    • 域名中最右侧的一个字段称为顶级域名。
      • 目前因特网存在 1k 多个顶级域名,例如:
        • com 表示商业组织。
        • cn 表示中国,由中国因特网信息中心(CNNIC)管理。
        • edu 表示教育机构。
        • gov 表示政府机构。
      • 管理顶级域名的机构有权分配二级域名,管理二级域名的机构有权分配三级域名,以此类推。
    • 例:用户可以向管理顶级域名 com 的机构申请一个二级域名 test.com ,然后自己划分三级域名 www.test.comftp.test.com ,还可以划分四级域名、五级域名等。
      • 这里的子域名 www 通常表示网站内部一个提供 Web 服务的主机。
      • 用户管理自己的域名时,可能使用域名的相对路径,比如 wwwimg.www ,比较简短,但是存在歧义。向 DNS 服务器查询域名时,只能使用 FQDN 格式。
    • 完全限定域名(Fully Qualified Domain Name,FQDN):从顶级域名开始的完整域名路径,例如 www.test.com

# DNS 服务

  • DNS 服务的一般流程:
    1. 当计算机要解析一个域名时,先查询自己的 DNS 缓存。若没有命中缓存,则向本地 DNS 服务器发送查询请求。
    2. 如果本地 DNS 服务器也没有缓存该 DNS 记录,则将查询请求转发给上游的 DNS 服务器。
      • 以此类推,最上游的是有权注册该域名的 DNS 服务器,称为权威 DNS 服务器。
      • 下游的 DNS 服务器通常会缓存上游的 DNS 记录。
  • DNS 协议是明文通信,因此可能泄露隐私、被篡改。有几种加密 DNS 的方案:
    • DoT(DNS over TLS):基于 TLS 协议加密传输 DNS 消息,默认使用 TCP 853 端口。
    • DoH(DNS over HTTPS):基于 HTTPS 协议加密传输 DNS 消息,默认使用 TCP 443 端口。
    • DoQ(DNS over Quic):基于 QUIC 协议加密传输 DNS 消息,默认使用 UDP 8853 端口。

# DNS 服务器

:用于为其它主机提供 DNS 服务。

  • DNS 服务器主要通过 UDP 广播信息,有时也会通过 TCP 发送和接收 DNS 数据库。

  • DNS 服务器会记录一些域名的解析规则,称为 DNS 记录。

    • DNS 记录分为多种类型,例如:
      A         # Address ,将域名解析到一个 IPv4 地址
      AAAA      # 将域名解析到一个 IPv6 地址
      CNAME     # Canonical Name ,将域名解析到另一个域名
      MX        # Mail eXchange ,将域名解析到一个邮件服务器
      NS        # Name Server ,记录管理该域名的下游 DNS 服务器的域名
      PTR       # Pointer ,将 IP 地址反向解析到域名
      SRV       # Service ,将域名解析到 IP 地址和 TCP/UDP 端口
      TXT       # 将该域名解析到一段字符串
      
    • 例:
      www.test.com  A  1.1.1.1
      www.test.com  A  1.1.1.2    # 可以给同一个域名添加多条 DNS 记录,解析到多个 IP 地址,然后根据权重随机生效,实现负载均衡
      ftp.test.com  A  1.1.1.3
      *.test.com    A  1.1.1.4    # 可以使用通配符,表示匹配任意子域名。这不会匹配主域名 test.com
      
    • 每条 DNS 记录可以设置 TTL(Time to live),表示建议下游服务器缓存它的时长,通常为 10 分钟。
    • 可以给不同网络线路,添加不同的 DNS 记录。比如对于电信用户、联通用户,将域名解析到不同的 IP 。对于中国用户、美国用户,将域名解析到不同的 IP 。
  • 目前因特网存在 13 组根域名服务器。

    • 可通过三级域名 [a-m].root-servers.net 查询到根域名服务器的 IP 地址。
      • 不过这些 IP 地址一般不会变化,会被下游 DNS 服务器长时间缓存。
    • 根域名服务器记录了各个顶级域名的 DNS 服务器的地址,而后者记录了各个二级域名的 DNS 记录。
  • 例如 8.8.8.8 是 Google 公司公开提供的 DNS 服务器。

# 备案

  • 如果将域名解析到 IP 位于中国大陆的服务器,则需要办理 ICP 备案。
    • 如果使用国外服务器,则不需要备案。
    • 主域名备案之后,子域名不需要备案。
  • 提供云服务器的平台一般拥有 ICP 接入商的资格,可以协助用户办理备案。
    • 备案时,需要说明网站用途,提交个人或企业的证件资料。
    • 经营性网站需要办理 ICP 许可证,非经营性网站需要办理 ICP 备案。
  • 中国政府要求 ICP 接入商履行以下义务:
    • 受理用户的备案申请。
    • 检查所有的 HTTP 请求,如果发向未经备案的服务器,则断开其 TCP 连接。
    • 定期检查已备案网站的内容,是否符合备案用途。