0%

《计算机网络》DNS 协议

什么是 DNS 服务器

DNS 服务器就是管理着域名与 IP 映射关系的机器。全世界分布着大量 DNS 服务器,其中有很多台根域名服务器

最初只有 13 台根域名服务器,这 13 台根域名服务器由 12 个组织独立运营,每个组织为了保证高可用,会部署更多根域名服务器提供服务,http://root-servers.org 可以查到所有根域名服务器

最初的 13 台根域名服务器被作为标杆配置在所有其他域名服务器的配置中,并被实时维护

ICANN 机构管理顶级域名,比如 com. cn.,都是 ICANN 机构规定的,想要开辟一个新的顶级域名,比如 sb. ,需要 ICANN 机构的同意才行

并不是顶级域名下面所有域名都由根域名服务器来管理,ICANN 机构想到将每个顶级域名的管理分发下去,就有了顶级域名托管商,比如 cn. 域名的托管商就是中国互联网络信息中心(CNNIC), com. 、net. 、name. 、gov. 的托管商是 Verisign 公司

这样的话,cn 下的二级域名就由中国互联网络信息中心来规定了,com 下的二级域名由 Verisign 公司来规定

Verisign 公司是一个商业公司,以赚钱为目的,就开放了顶级域名下二级域名的自主购买通道,比如你想拥有 abc.com 域名的管理权(其实就是 Verisign 公司的下一级托管商),那么你支付他钱就可以了,godaddy 这些域名服务商就通过付钱拿到了很多二级域名的管理权,godaddy 就是 Verisign 公司的下一级托管商之一

godaddy 又通过将管理权出售,从中赚取差价利润,你去 godday 购买域名的过程其实就是购买二级域名管理权的过程,当然,你拥有二级域名管理权之后,你也可以继续发展你的三级域名托管商,继续赚取差价,但目前是没有利润空间的

DNS 协议

DNS 协议是应用层协议,其搭载的是 UDP 传输协议。用于域名的解析

DNS 报文格式

  • 标识 ID:请求客户端设置的 16 位标示,服务器给出应答的时候会带相同的标示字段回来,这样请求客户端就可以区分不同的请求应答了。

  • 标志:16 个位

    • QR: 1 个比特位用来区分是请求(0)还是应答(1)

    • OPCODE: 4 个比特位用来设置查询的种类,应答的时候会带相同值,可用的值如下:

      • 0 标准查询 (QUERY)
      • 1 反向查询 (IQUERY)
      • 2 服务器状态查询 (STATUS)
      • 3-15 保留值,暂时未使用
    • AA 授权应答(Authoritative Answer): 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。
      注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。

    • TC 截断(TrunCation): 用来指出报文比允许的长度还要长,导致被截断。

    • RD 期望递归(Recursion Desired): 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。

    • RA 支持递归(Recursion Available): 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。

    • Z: 保留值,暂时未使用。在所有的请求和应答报文中必须置为0。

    • RCODE 应答码(Response code): 这4个比特位在应答报文中设置,代表的含义如下:

      • 0 没有错误。
      • 1 报文格式错误(Format error) - 服务器不能理解请求的报文。
      • 2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。
      • 3 名字错误(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在。
      • 4 没有实现(Not Implemented) - 域名服务器不支持查询类型。
      • 5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。
      • 6-15 保留值,暂时未使用。
  • 问题数 QDCOUNT: 无符号16位整数表示报文请求段中的问题记录数。

  • 资源记录数 ANCOUNT: 无符号16位整数表示报文回答段中的回答记录数。

  • 授权资源记录数 NSCOUNT: 无符号16位整数表示报文授权段中的授权记录数。

  • 额外资源记录数 ARCOUNT: 无符号16位整数表示报文附加段中的附加记录数。

  • 查询问题:描述查询的问题,由三部分构成

    • 查询名 QNAME:要查找的名字,是一个或多个标识符的序列。

      每个标识符以首字节的计数值来说明随后标识符(baidu.com 有两个标识符 baidu 和 com)的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。单个标识符最大长度为63字节。

      下面就是 域名 gemini.tuc.noao.edu 的表示

    • 查询类型 QTYPE: 每个问题有一个查询类型。

      2 个字节表示查询类型,取值可以为任何可用的类型值,以及通配码来表示所有的资源记录。

      以下是常用的一些类型:

      • A (1) 期望获得查询名的 IP 地址。
      • NS (2) 一个授权的域名服务器。
      • NAME (5) 规范名称。
      • PTR (12) 指针记录。
      • HINFO (13) 主机信息。
      • MX (15) 邮件交换记录。
      • AXFR (252) 对区域转换的请求。
      • ANY (255) 对所有记录的请求。
    • 查询类:

      • IN (1) 指互联网地址。
      • CS (2) the CSNET class (Obsolete - used only for examples in some obsolete RFCs)
      • CH (3) the CHAOS class
      • HS (4) Hesiod [Dyer 87]
  • 回答:多个ip的话会有多个应答,每个应答的格式如下

    • 域名NAME 资源记录包含的域名
    • 类型TYPE 2 个字节表示资源记录的类型,指出 RDATA 数据的含义
    • 类CLASS 2 个字节表示 RDATA 的类
    • 生存时间TTL 4 字节无符号整数表示资源记录可以缓存的时间。0 代表只能被传输,但是不能被缓存。
    • 资源数据长度 2 个字节无符号整数表示 RDATA 的长度
    • 资源数据 RDATA 不定长字符串来表示记录,格式根 TYPE 和 CLASS 有关。比如,TYPE 是 A,CLASS 是 IN,那么 RDATA 就是一个 4 个字节的 ARPA 网络地址。

DNS 查询原理(以 mac 举例)

1
ping baidu.com
  • 向自己本机配置的域名服务器查询

    联网后,操作系统会自动将本机的DNS服务器配置为网关地址,/etc/resolv.conf(是dns解析类库使用的配置文件,使用了此类库来解析域名的应用都会访问此文件中配置的nameserver字段,比如ping工具) 文件会被自动重新生成,里面的nameserver字段会被改成网关地址

    当然你也可以将网关地址改成自定义的地址,比如 8.8.8.8,改完后/etc/resolv.conf又会被重写

    我这里使用网关地址(其实就是路由器的 ip)作为 DNS 服务器

    这里是查询数据包

    路由器收到 DNS 请求后会自动转发请求到 ISP 的 DNS 服务器(路由器接入 ISP 后会取到,也可以进入路由器手动设置这个地址)

    路由器收到回复后转发给我的机器

    下面是回复的数据包

  • ISP 的域名服务器解析域名

    ISP 的域名服务器首先查找自己的资源记录,没有的话就查找缓存(可能其他机器已经查询过 baidu.com 对应的 ip,缓存中就已经有了这个对应关系),缓存也没有的话,就会将请求转发给根域名服务器(13 个根服务器 ip 地址会被每个域名服务器实时维护,https://www.internic.net/domain/named.root 这里就是 13 个根服务器)

    根域名服务器一样先查找记录以及缓存,没有的话就回复顶级域名 com. 所处的域名服务器的 ip

    https://www.internic.net/domain/root.zone 这里是根域名服务器的资源记录

    ISP 的域名服务器收到 com. 所处的域名服务器的 ip 后,就向其发起同样的域名查询请求,com. 所处的域名服务器也会查找记录,发现有 baidu.com 的对应 ip ,就返回 ip




微信关注我,及时接收最新技术文章