DNS服务器是如何工作的?
我们上网从打开浏览器开始,输入网址,按下回车,浏览器显示给你一个漂亮的网页,一切看上去都是这样自然。然而大学计算机网络老师告诉我们,ip是定位网络中主机的地址的。只有知道了ip地址才能访问对方主机也就是访问服务器,如果连服务器都无法访问,也就无从谈起怎么得到网页了。
大多数同学都是知道的,存在一个将网址解析成ip地址的玩意——DNS服务器。可以理解为输入一个网址,返回一个ip,当然它也不单单是为了web应用而生,邮件应用也要靠它,输入一个邮件地址,返回一个优先级和邮件服务器网址和ip(优先级是因为有可能配置多级服务器)
那么DNS到底是怎么工作的,身为程序员都有一颗追求底层的心。必须要一追到底!
首先你打开你的电脑,一般都是windows系统
如果要解析一个从未解析过的网址,首先通过操作系统的Socket库中方法将网址信息组装成一条请求消息发送到这台服务器上,然后DNS服务器根据这条消息,查询内置的表格,返回对应的结果。
首先了解一下请求消息的格式:网址+class+类型
网址就是你要转换成ip的网址,不用解释,class代表internet,现在基本都是IN,因为上世纪还存在除了internet之外的网络,类型代表是请求类型,到底是web应用的请求还是邮件应用的请求,web应用类型为A,address,邮件应用类型为MX。
然后DNS服务器中有一个表格
网址 | class | 类型 | 响应数据 |
www.baidu.com | IN | A | X.X.X.X |
XXX@163.COM | IN | MX | 10 www.sadsd.com |
www.sadsd.com | IN | A | Y.Y.Y.Y |
然后根据请求消息的值去和这个表一一对应,返回对应的响应结果。如果是MX类型,返回优先级和邮件服务器网址,网址还会自动解析成ip地址,如果上图显示
好像到现在,网址解析成ip的问题已经解决了,但是好像还有个问题,如果这个DNS服务器没有这个地址所对应的响应数据咋办,返回为空咋办?
这得说下网址得构成了,出现网址是因为ip地址太难记忆,没有网址可以形式化记忆如拼音,单词等等。网址一般由如下组成
xx.ss.cc.zz.tt.yy。一串字符串由点分割开来,每个小段称之为一个域,如www.baidu.com 这就代表com域,baidu域,www域
网址得组成和公司结构类似,上级管理一堆下级。在网址上就是com域下面得子域baidu域,baidu域下面子域www域。每一个域由一个DNS服务器管理(其实可以一个DNS管理多个域),上层域保管下层域对应的DNS服务器的ip,这样我们可以根据最高的域顺藤摸瓜的找到对应的网址,从而找到对应ip。例如www.baidu.com 首先找com,然后baidu,再找www
但是这又有个问题,很多网址的结尾是不一样的,例如cn ,com,org。难道我要保存这些域的DNS所有服务器的IP嘛,我去哪里找他们,其实很多网址我们书写其实是不正确的,例如www.baidu.com正确写法应该是www.baidu.com.最后有个.这个点代表的根域,这个根域是最高域,管理着com,org,cn。这个根域也对应的根DNS服务器,全球一共有13个根服务器,这里是服务集群,不是说只有13个服务器(互联网的去中心化很重要啊)。
这些根服务器已经内置到了各个计算机当中,最开始首先访问最近的DNS服务器如果找不到,就开始找根服务器,然后顺藤摸瓜的往下找,直到找到然后返回ip。值得注意的是每次请求和响应都是最近这个DNS服务器去请求,最终也由这个DNS服务器查询到ip地址返回给客户端。找到了之后DNS服务器和本地会缓存一份,下次再用就不需要重新查找。