在使用浏览器时,要访问一些网站的话,就是输入相应网站提供给公众的域名进行访问,但是学过网络编程的也知道,这背后隐藏从域名
->IP
的转化过程,这就是我们今天要说的内容。主要说说折背后的工作原理吧!
DNS(域名系统)是互联网的中心部分,提供网站名称到实际IP的转化服务,所以也称域名系统为域名解析服务器。
- 迭代查询
本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。
当我们在浏览器中输入例如像www.google.com这样的网址,操作系统首先检查自己本地的hosts文件是否有这个网址映射关系,如果有的,就先调用这个IP地址映射关系,完成地址解析。
如果hosts中没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址的映射关系,如果有,直接返回,完成域名解析。
如果hosts与本地DNS解析器缓存都没有相应的映射关系,首先找TCP/IP参数中设置的首选DNS服务器,在此我们叫他本地DNS服务器此服务器收到查询时,如果要查询的域名包含在本地配置区域资源
中,则返回解析结果给客户机,完成域名解析,此解析具有权威性
。
如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已经缓存了此网址的相关映射关系
,则调用这个IP地址映射,完成域名解析,此解析不具有权威性
。
如果本地服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置进行查询,如果未用转发模式,,本地DNS就把请求发至13台根DNS,根DNS服务器收到IP信息后,将(如.com)由谁授权管理,并会返回一个负责该顶级域名服务器(TLD)的IP,本地DNS服务器收到IP后,将会联系负责.com域的下一级DNS服务器(.qq.com)给本地DNS服务器,当本地DNS服务器收到这个地址后,就会找到qq.com域的服务器,重复上面的动作进行查询,直至找到www.qq.com主机。
如果使用转发模式,此DNS服务器就会将请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把请求转发至上上级,依次循环,不管是本地DNS服务器用还是转发,还是根提示,将结果返回给本地DNS,由此DNS服务器再返回给客户机。
以下为域名系统的域名树:
图片来源于网络!
递归查询:
本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机。
这里就不模拟了,说的也比较通俗了!
DNS协议报文格式:
会话标识
:
是DNS报文的ID标识,对于请求报文和相应的应答报文,这个字段是相同的,通过它可以区分DNS应答为那个请求的响应。
标志
:
QR(1bit)查询响应标志,0为查询,1为响应。
opcode(4bit)0表示反向查询,2为服务器状态请求
AA(1bit)表示授权回答
TC(1bit)表示可以截断的
RD(1bit)表示期望递归
RA(1bit)表示可用递归
rcode(4bit)表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误
数量字段(共八字节):Question,Answer RRs, Authority RRs,Addtional RRs各自表示后面的区域的数量。Questions表示查询问题的数量,Answers表示回答区域的数量,Authoritatives nameservers表示授权区域的数量,Additional records表示附加区域的数量。
Querys区域
查询名:长度不固定,且不使用填充字节,一般该字段表示的是需要查询的域名,如果是反向查询,则为IP,一般格式如下:
查询类型
1 A 有域名获取IPV4地址
2 NS 查询域名服务器
5 CNAME 查询名称规范
6 SOA 开始授权
11 WKS 熟知服务
…
查询类
通常为1,表名是Internet 数据
资源记录区域(RR)包括回答区域,授权区域,和附加区域
域名
他的格式和Queries区域查询的名字字段是一样的,有一点不同的是,当报文域名出现重复的时候,该字段使用两个字节偏移来表示。
查询类
对于Internet信息,总是IN
生存时间
TTL
表示资源记录的生命周期,一般 用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,也可以表示该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值。
资源数据
该字段是可变长的字段,表示按照查询段的要求返回相关资料记录的数据。可以是Address或者CNAME等。
在请求DNS解析的时候,会请求端口为53的DNS服务器,所以我们下面使用wireshark分析一下,nslookup 某东的DNS解析过程。
使用wireshar抓取端口为53的应用程序的udp包。
在终端输入:
nslookup www.jd.com
第一个包DNS(query):
可以观察到之前说到的包从TransactionID一下就是协议包的相应设置。
第二个包(DNS response):
与第一个请求包不同的是,在answer字段设置成了3,我们看到线面answer回的域名数量确实是3。这三个域名下,可以看到一个包含相应的IP地址:
所以第三次就直接查询这个域名的IP了:
最后获取到了相应的IP地址: