English | 中文版
[TOC]
DNS名称空间形成了层级结构,顶部的树根未命名。
顶级域名(TLD)包含:
gTLD通用顶级域名-
通用
-
通用限制
-
赞助
-
ccTLD国际代码顶级域名IND ccTLD国际化国家代码顶级域名ARPA(基础设施)
顶级域名(TLD)+子域名(subdomain)
主要由2部分构成:
- 用于执行对DNS特定名称查询的
查询/响应协议 - 名称服务器用于交换数据库记录的协议(区域传输)
dns消息格式:dns头部(12字节)+区段(变长)
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.edu和ucla.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
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
-
查询名称(Query Name)
要被查询的域名
-
查询类型(Query Type)
正在执行的查询类型
-
查询类(Query Class)
- 1: 互联网类
- 254: 没有类
- 255: 所有类
- 名称(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.arpa和ip6.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] | 请求任意记录 |
根据域名查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服务器发送动态更新的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 |
主服务器到从服务器内容同步。
[1] TCP/IP详解-卷一



