1.DNS是怎么工作的
首先我们可以很简单的理解DNS协议,它就是一个将域名与ip地址进行双向转换的协议,而消息类型只有查询和回应2种类型。那客户端查询域名,是要请求谁呢?答案是域名服务器,现在域名服务器分为以下4类,按照层次从上往下:
根域名服务器:最高层次最重要的域名服务器,它知道所有的顶级域名服务器的域名和ip地址,一般请求根域名服务器返回的是要请求的顶级域名服务器的ip地址。我们常常听说的13个域名服务器指的就是它,但根域名服务器绝不是由仅仅的13台服务器组成,而是一个域名服务器由多个主机组成,它们有相同的ip。现在基本上普通域名服务器都能就近找到一台根域名服务器,当本地域名服务器请求根域名服务器时,路由器就能找到离这个本地域名服务器最近的一个根域名服务器。
顶级域名服务器:它负责该顶级域名中所有注册的二级域名。比如.com顶级域名服务器里就存放了所有xxx.com域名和ip地址映射表。
权限域名服务器:这类服务器负责某一特定域名的域名解析,很多公司都有权限域名服务。比如腾讯有它的权限域名服务器,里面存储了腾讯域名和ip地址的映射关系。同时权限域名服务器也充当了本地域名服务器的角色,你可以将你的域名注册到腾讯的域名服务器中。
本地域名服务器:这台服务器的ip地址就是我们电脑里配置的dns,本地域名服务器一般离用户是比较近的,当本地主机无法解析域名就会给本地域名服务器发送请求。
现在知道请求的是域名服务器了,也知道了一共有哪几类域名服务器,接下来我画了张图来描述整个dns请求的流程,整个过程采用迭代查询。注意权限域名服务器一般是不会采用递归查询的,它会直接返回ip地址让请求着再去访问这个ip。
2.DNS数据格式
dns固定首部为12字节,如下图所示。当请求本地域名服务器如果它已经缓存了这个域名所对应的ip地址,那么这个答案将会被标记为非权威的,只有权限域名服务器返回的数据包才会将这个包标记为权威的,这对应着固定首部中的权威答案数据。后2张表格是dns首部中的标志位数据和rCode的数据。随着dns的发展标志中的16位功能已经有点不够用了,因此现在有很多dns服务器运行EDNS(扩展DNS),原来回应数据如果超过512字节将会被丢弃进而可以转为tcp连接,EDNS则可以支持超过512字节的大数据包回应。
QR 1位 | 查询时这位为0,回应则为1 |
Opcode 4位 | 定义查询或回应的类型,值为0表示是一个标准的查询/回应 |
AA 1位 | 在回应数据包中使用,值为1表示回应是一个权威回应。 |
TC 1位 | 当回应大于512字节时此标志位置1,最终数据长度会被删减为512字节,此时客户端可采用tcp来询问 |
RD 1位 | 客户端使用递归时此位会置1 |
RA 1位 | 只在回应数据包中设置,当为1时表示可采用递归回应 |
保留位 3位 | 全都设置为0 |
rCode 4位 | 仅在回应消息中有用,表示返回类型 |
rCode | 错误类型 |
0 | 没有错误 |
1 | 格式错误 |
2 | 名称服务器错误 |
3 | 域参照错误 |
4 | 不支持的查询类型 |
5 | 不允许的动作 |