打开一个项目网址中间发生了什么
1、DNS解析
2、TCP连接
3、发送HTTP请求
4、服务器处理请求并返回HTTP报文(apach,tomcat。nginx)
5、浏览器解析渲染页面
6、连接结束
DNS是什么
DNS就是将域名转换为IP的,因为我们人类的记忆力太差,根本记不住IP,而电脑通信又必须用IP,所以人类发明了域名,让我们可以记住http://baidu.com、http://taobao.com这种还算能记得住的域名。然后通过DNS,将这些域名转换为电脑需要的IP。
DNS是怎么工作的
每个电脑里面都设置了本地DNS服务器(简称LDNS),需要的时候,就向LDNS发出请求,LDNS在网上问权威域名服务器(简称权威DNS),有时候问一家是不够的,要问一大圈下来,最后才能得到答案。
- 域名级别:.代表根域名, .com这种是顶级域名,也叫一级域名,http://baidu.com这种叫二级域名, www.baidu.com 这种叫三级域名,依次类推。
- 权威DNS:负责对请求作出权威的回答。权威DNS中存储着记录,最常见的3种:A记录(记录某域名和其IP的对应),NS记录(记录某域名和负责解析该域的权威DNS),CNAME记录(负责记录某域名及其别名)。权威能直接回答的,就回A记录;需要其他权威DNS回答的,就回NS记录,然后LDNS再去找其他权威DNS问;如果该记录是别名类型的,就回CNAME,LDNS就会再去解析别名。
- 递归DNS:通常就是LDNS,它接受终端的域名查询请求,负责在网上问一圈后,将答案返回终端。
- 具体例子:终端请求http://www.baidu.com这个域名的IP
在没有缓存时,LDNS会从根DNS问起:
1、LDNS问根DNS说:“http://www.baidu.com的IP是多少啊?”。
2、根DNS说:“我哪有时间管你这么细的问题,你去问com顶级域的DNS吧,我只管到顶级域,喏,这些是com顶级域DNS的名字和IP,你去问它们吧”。(以NS记录回应)
3、LDNS又忙问com的权威DNS,com权威DNS说:“你问的这是三级域名,我不管这么多,你去问http://baidu.com的权威DNS吧,它的名字是http://ns.baidu.com,他的IP是XXX(这里可能给出多个权威DNS)”。
4、LDNS继续问http://baidu.com的权威DNS,这次痛快,因为http://www.baidu.com正是它管的,它可能直接给出A记录,也可能给出CNAME记录,如果是前者,就直接得到IP,如果是后者,就需要对别名再做查询。
5、最终,LDNS得到http://www.baidu.com的IP,并将其返回给终端。
在第1步中,LDNS问根DNS的时候,他是怎么知道根DNS的IP的?
这13个IP通常是预先配置在LDNS里面的。在LDNS初始化DNS缓存或者缓存失效的时候,LDNS向自己被预先配置的这些IP中的一个,发起对根的查询(也即询问.的NS记录),获得最新的根DNS的信息6。
对于DNS服务器软件而言,这13个IP,配置在根提示文件(root hints file)中,可能是named.cache或http://root.ca或root.hints等等之类的文件。
上面就是各种教科书中都会讲到的DNS查询过程,但实际上,没有这么麻烦,因为各个层面都是有缓存的。
- 实际DNS查询的过程
用户在浏览器中输入这个域名:http://123.abc.qq.com.cn
1、浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去hosts文件看,也没有,才会去问LDNS。
2、LDNS会去先看看自己有没有http://123.abc.qq.com.cn的A记录,要有就直接返回,要没有,就去看有没有http://abc.qq.com.cn的NS记录,如果有,就去问它要答案,如果没有,就去看有无http://qq.com.cn的NS的记录,如果有,就去问它,没有就去看有无http://com.cn的DNS,还没有就去看有无cn的DNS,如果连cn的NS记录都没有,才去问根。
所以,有了缓存以后,教科书上那种从根问起的情况,实际上很少发生。
只有在各处都没有缓存的时候,我们才会问根。本地DNS服务器到底是什么
在通过浏览器缓存及host文件都无法解析域名的情况下,OS会将这个域名发送给计算机网络配置中DNS对应的地址(LDNS),即本地区的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务,假如是在学校接入的互联网,那么这个本地区的域名服务器基本上是在学校中;如果是在小区接入的互联网,那么这个本地区的域名服务器就是提供给你接入互联网的应用服务上,也就是电信或联通。 《深入分析java web 技术内幕》 许令波著
直接叫本地域名服务器有一定的歧义,还是“本地区的域名服务器”更加易于理解。