Skip to content

Latest commit

 

History

History
225 lines (131 loc) · 8.46 KB

File metadata and controls

225 lines (131 loc) · 8.46 KB

English | 中文版

DNS协议

[TOC]

DNS名称空间

DNS名称空间形成了层级结构,顶部的树根未命名。

顶级域名(TLD)包含:

  • gTLD 通用顶级域名
    • 通用

    • 通用限制

    • 赞助

  • ccTLD 国际代码顶级域名
  • IND ccTLD 国际化国家代码顶级域名
  • ARPA(基础设施)

DNS命名语法规则

顶级域名(TLD)+子域名(subdomain)

DNS协议

主要由2部分构成:

  1. 用于执行对DNS特定名称查询的查询/响应协议
  2. 名称服务器用于交换数据库记录的协议(区域传输)

DNS消息格式

dns消息格式:dns头部(12字节)+区段(变长)

dns_struct

dns消息末尾的可变长度区段包含:

  • 问题

  • 回答

  • 授权

  • 额外信息

等名称;每个名称由一系列标签组成;

标签分2类:

  • 数据标签(data label)

    包含标签字符

    格式:[接下来的标签字符长度+标签字符]+[接下来的标签字符长度+标签字符]+...+0

    例:www.person.com的标签值如下:|3|w|w|w|7|p|e|a|r|s|o|n|3|c|o|m|0|

    注意:标签字符最长63字节

  • 压缩标签(compression label)

    例:usc.eduucla.edu的压缩标签值如下:|3|u|s|c|3|e|d|u|0|4|u|c|l|a|192|4|0|

    192: 表示压缩标签

    192后面的4表示: 偏移到index=4的位置:...|3|...

    压缩标签可以通过引用其他标签从而节省空间

RCODE域中使用的前10个错误类型:

名称 参考 描述和目的
0 NoError [RFC1035] 没有错误
1 FormErr [RFC1035] 格式错误;查询不能被解读
2 ServFail [RFC1035] 服务器失效;服务器的处理错误
3 NXDomain [RFC1035] 不存在域名;引用了未知域名
4 NotImp [RFC1035] 没有实现;请求在服务器端不被支持
5 Refused [RFC1035] 拒绝;服务器不希望提供回答
6 YXDomain [RFC2136] 名称存在但是不应该存在(用于更新)
7 YXRRSet [RFC2136] RRSet存在但是不应该存在(用于更新)
8 NXRRSet [RFC2136] RRSet不存在但是应该存在(用于更新)
9 NotAuth [RFC2136] 服务器不是为该区域授权的(用于更新)
10 NotZone [RFC2136] 在区域中不包含名称(用于更新)

实现

TODO

IP协议

格式

DNS名字服务器使用的熟知端口号无论对UDP还是TCP都是53

DNS同时支持UDP和TCP,一般使用UDP,以下2种情况需要使用TCP:

  • 当查询数据过大以至于产生了数据截断(TC标志为1),这时,需要利用TCP的分片能力来进行数据传输。
  • 当主服务器(master)和辅服务器(slave)之间通信,辅服务器要拿到主服务器的zone信息。

IPv4 UDP数据报:

IPv4 UDP头部 DNS固定头部 问题区段 回答区段 授权区段 额外信息区段
20字节:无选项 8字节 12字节 可变长 可变长 可变长 可变长

DNS消息通常封装在UDP/IPv4数据报中,并且其长度限制为512字节,除非不使用TCP和EDNS0.每个区段(除了问题区段)包含一组资源记录;

注意:小的消息用UDP传输,消息太大就会切换成TCP

问题区段格式

dns_query_struct

  • 查询名称(Query Name)

    要被查询的域名

  • 查询类型(Query Type)

    正在执行的查询类型

  • 查询类(Query Class)

    • 1: 互联网类
    • 254: 没有类
    • 255: 所有类

回答/授权额外区段格式

dns_ans_auth_struct

  • 名称(Name): 拥有者
  • 类型(Type): 资源记录类型(RR)
  • 类(Class): 1: 互联网数据...
  • TTL(Time to live): RR可以被缓存的秒数
  • RDLENGTH(Data length): 资源数据长度;指定RDATA字段的字节数
  • RDATA: 资源数据

资源记录类型

在DNS协议消息中使用的流行的资源记录类型和查询类型:

RR类型 参考 描述和目的
1 A [RFC1035] IPv4地址记录(32位IPv4地址)
2 NS [RFC1035] 名称服务器;提供区域授权名称服务器的名称
5 CNAME [RFC1035] 规范名称;讲一个名称映射为另一个(提供一种形式的名称别名)
6 SOA [RFC1035] 授权开始;为区域提供授权信息(名称服务器,联系的电子邮件地址,序列号,区域传输计时器)
12 PTR [RFC1035] 指针;提供地址到(规范)名称的映射;在in-addr.arpaip6.arpa域中用于IPv4和IPv6的逆向查询
15 MX [RFC1035] 邮件交换器;为一个域提供电子邮件处理主机的名称
16 TXT [RFC1035]
[RFC1464]
文本;提供各种信息(如,与SPF发垃圾邮件方案一起使用以识别授权电子邮件服务器)
28 AAAA [RFC3596] IPv6地址记录(128位IPv6地址)
33 SRV [RFC2782] 服务器选择;通用服务的传输终点
35 NAPTR [RFC3403] 名称授权指针;支持交替的名称空间
41 OPT [RFC2671] 伪RR;支持更大的数据报,标签,ENDS0中的返回码
251 IXFR [RFC1995] 增量区域传输
252 AXFR [RFC1035]
[RFC5936]
完全区域传输;通过TCP运载
255 (ANY) [RFC1035] 请求任意记录

DNS查询

正向查询

根据域名查IP。

反向查询

根据ip查域名。

DNS使用另一棵子树来维护ip->域名的对应表,这个子树的根节点是in-addr.arpa,例:一个IP(192.168.11.2)所具有的DNS地址是2.11.168.192.in-addr.arpa(ip倒置)。在DNS系统里面,一个反向地址对应一个PTR记录(对应A记录),所以反向查询又叫做指针查询(PTR)

动态更新(DNS UPDATE)

向一个区域的授权DNS服务器发送动态更新的DNS消息,服务器收到消息后评估先决条件(prerequisite),为真就执行更新。

5种先决条件: todo

先决条件类型(语义) 类设置 类型设置 RDATA设置
RRSet存在(不依赖于值) ANY 与区域的类型相同
RRSet存在(依赖于值) 与区域的类相同 正在被检查的类型 正在被检查的RRSet
RRSet不存在 NONE 正在被检查的类型
名称在使用 ANY ANY
名称没有使用 NONE ANY

Update区段中使用的RR类和类型字段说明了更新类型: todo

用法 类设置 类型设置 RDATA
向RRSet添加RR 与区域的类相同 正被添加的RR的类型 正被添加的RR的RDATA
删除RRSet ANY 正被删除的RRSet的类型 空(TTL和RDLENGTH也是0)
从名称中删除所有的RRset ANY ANY 空(TTL和RDLENGTH也是0)
从RRset中删除RR NONE 正被删除的RR的类型 要删除的匹配的RDATA

区域传输和DNS通知

主服务器到从服务器内容同步。

dns_notice

参考

[1] TCP/IP详解-卷一