DNS全解析

一.DNS来源

最开始世界上的机器比较少,使用host来解析就够了。

到后来机器变的多了,改用由中心服务器统一更新host文件,各地的机器通过ftp从中心服务器更新host文件到本地

再到后来,机器更多了,只由中心服务器来更新host文件也力不从心了,于是改成分布式的,并逐渐演化到了今天的DNS系统

二.DNS服务器分类

与域名对应,分根域名服务器,顶级域名服务器和权威服务器。作用如下

类别作用
根域名服务器只关心所有顶级域名服务器的域名和IP地址
顶级域名服务器自己的顶级域名下的所有二级域名和地址
权威域名服务器负责自己区域的所有域名和地址(一主多备)

1.根域名服务器

根域名服务器只记录所有顶级域名服务器的域名和IP地址。比如它们只记录.cn,.com等这些顶级域名的服务器的解析。
全球有13组根域名,从a.root-servers.net 到m.root-servers.net。注意是根域名,不是根域名服务器。全世界各地都有根域名服务器,国内的话北京和上海有。根域名的分布可以在www.root-servers.org查看。
根域名是最重要,最关键

2.顶级域名服务器

顶级域名服务器只负责自己的顶级域名解析。比.cn的顶级域名,它只解析和.cn相关的域名,并且只解析到xxx.cn

3.权威域名服务器

权威域名服务器就是负责具体的域名解析了。比xiaoxiaoguo.cn就有一台权威域名服务器,它只解析和xiaoxiaoguo.cn相关的域名。

4.本地域名服务器

还有种dns服务器叫本地域名服务器(也可能有其他叫法),它不属于上面任何一种。但它也解析域名,如家用路由器上的192.168.1.1,114.114.114.114或者一些运营商的dns。本地域名服务器发挥了很大的作用,分担了整个dns系统的压力。

三.DNS记录

主要了解A记录,4A记录,MX记录,CNAME记录, NS记录即可。

四.DNS解析过程

当我们去解析一个域名时,比如解析xiaoxiaoguo.cn,会经过如下步骤:
1.查看本机的缓存有无该域名记录,如果没有,查看本机的host文件有无该域名记录,如果没有,则发个请求到本地DNS服务器。
2.本地DNS服务器收到请求后,查看是否有该域名的解析,如果有,返回解析记录给主机,如果没有,则请求根域名服务器
3.根域名服务器收到请求后,返回该域名对应的顶级域名服务器,比如这次请求返回.cn的服务器地址
4.本地域名服务器接到顶级域名服务器地址后,向该顶级域名服务器请求
5.顶级域名服务器返回该域名的权威服务器地址,比如这次返回xiaoxiaoguo.cn对应的权威服务器地址
6.本地域名服务器获得该地址后,发请求到该域名的权威服务器。
7.权威服务器返回该域名对应的解析。
8.本地域名服务器获取该解析后,返回给主机,解析完成。

这里可能会有个疑问:本地服务器是怎么知道根域名服务器的地址?如果安装了bind服务,可以看到默认有个name.ca的文件,里面记录了13组根域的解析。所以本地域名服务器默认就有根域的解析。

五.DNS报文结构

现在的DNS主要还是通过UDP来通讯,大小不超过1500个字节。报文结构如下:

  +--+--+--+--+--+--+--+
  |      Header        |
  +--+--+--+--+--+--+--+
  |      Question      |
  +--+--+--+--+--+--+--+
  |      Answer        |
  +--+--+--+--+--+--+--+
  |      Authority     |
  +--+--+--+--+--+--+--+
  |      Additional    |
  +--+--+--+--+--+--+--+

按格式来区分的话,可以分为三部分:头部Header,查询部分Question,应答部分:Answer,Authority,Additional

1.头部Header

报文格式如下

Header format

    0  1  2  3  4  5  6  7  0  1  2  3  4  5  6  7
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                      ID                       |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |QR|  opcode   |AA|TC|RD|RA|   Z    |   RCODE   |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    QDCOUNT                    |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    ANCOUNT                    |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    NSCOUNT                    |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    ARCOUNT                    |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

各字段作用如下

ID: 2个字节(16bit),标识字段,客户端会解析服务器返回的DNS应答报文,获取ID值与请求报文设置的ID值做比较,如果相同,则认为是同一个DNS会话。
FLAGS: 2个字节(16bit)的标志字段。包含以下属性:
QR: 0表示查询报文,1表示响应报文;
opcode: 通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求),[3,15]保留值;
AA: 表示授权回答(authoritative answer)– 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器;
TC: 表示可截断的(truncated)–用来指出报文比允许的长度还要长,导致被截断;
RD: 表示期望递归(Recursion Desired) – 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的;
RA: 表示支持递归(Recursion Available) – 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询;
Z : 保留值,暂未使用;
RCODE: 应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:
0 : 没有错误。
1 : 报文格式错误(Format error) - 服务器不能理解请求的报文;
2 : 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求;
3 : 名字错误(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在;
4 : 没有实现(Not Implemented) - 域名服务器不支持查询类型;
5 : 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答.比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer);
[6,15] : 保留值,暂未使用。
QDCOUNT: 无符号16bit整数表示报文请求段中的问题记录数。
ANCOUNT: 无符号16bit整数表示报文回答段中的回答记录数。
NSCOUNT: 无符号16bit整数表示报文授权段中的授权记录数。
ARCOUNT: 无符号16bit整数表示报文附加段中的附加记录数。

2.Question 查询字段

报文格式如下:

  Question format

    0  1  2  3  4  5  6  7  0  1  2  3  4  5  6  7
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                     ...                       |
  |                    QNAME                      |
  |                     ...                       |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    QTYPE                      |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    QCLASS                     |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

各字段作用如下

QNAME 8bit为单位表示的查询名(广泛的说就是:域名).
QTYPE 无符号16bit整数表示查询的协议类型.
QCLASS 无符号16bit整数表示查询的类,比如,IN代表Internet.

3.应答部分Answer/Authority/Additional

它们的结构如下

Answer/Authority/Additional format

    0  1  2  3  4  5  6  7  0  1  2  3  4  5  6  7
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    NAME                       |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    TYPE                       |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    CLASS                      |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    TTL                        |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    RDLENGTH                   |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  |                    RDATA                      |
  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

各字段作用如下

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

对这部分,可以通过wireshark等抓包软件抓个包看看,抓包的过程就不赘述了。

六.搭建DNS服务器

参考:http://blog.csdn.net/u012375924/article/details/50779891

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值