从输入URL到页面加载完成的过程-DNS解析域名过程

从输入URL到页面加载完成的过程-DNS解析域名过程

原文链接

当我们输入一个url,比如为:http://my.oschina.net/u/128568/blog,浏览器会解析这个url分成三部分,域名:my.oschina.net,端口:80,请求资源:/u/128568/blog。下面给出浏览器查找域名对应IP的过程,域名为my.oschina.net:

1、浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)

2、操作系统检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

3、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析

4、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器(ISP的DNS),在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性

5、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性

6、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至 “根DNS服务器”,“根DNS服务器”收到请求后会判断这个域名(.net)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.net域的这台服务器。这台负责.net域的服务器收到请求后,如果自己无法解析,它就会找一个管理.net域的下一级DNS服务器地址(oschina.net)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找oschina.net域服务器,重复上面的动作,进行查询,直至找到my.oschina.net主机

7、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机

看下解析过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
➜ /Users/zyj >dig +trace my.oschina.net

; <<>> DiG 9.8.3-P1 <<>> +trace my.oschina.net
;; global options: +cmd
. 191557 IN NS e.root-servers.net.
. 191557 IN NS i.root-servers.net.
. 191557 IN NS a.root-servers.net.
. 191557 IN NS k.root-servers.net.
. 191557 IN NS g.root-servers.net.
. 191557 IN NS j.root-servers.net.
. 191557 IN NS h.root-servers.net.
. 191557 IN NS c.root-servers.net.
. 191557 IN NS l.root-servers.net.
. 191557 IN NS f.root-servers.net.
. 191557 IN NS d.root-servers.net.
. 191557 IN NS b.root-servers.net.
. 191557 IN NS m.root-servers.net.
;; Received 228 bytes from 114.114.114.114#53(114.114.114.114) in 39 ms

net. 172800 IN NS m.gtld-servers.net.
net. 172800 IN NS l.gtld-servers.net.
net. 172800 IN NS k.gtld-servers.net.
net. 172800 IN NS j.gtld-servers.net.
net. 172800 IN NS i.gtld-servers.net.
net. 172800 IN NS h.gtld-servers.net.
net. 172800 IN NS g.gtld-servers.net.
net. 172800 IN NS f.gtld-servers.net.
net. 172800 IN NS e.gtld-servers.net.
net. 172800 IN NS d.gtld-servers.net.
net. 172800 IN NS c.gtld-servers.net.
net. 172800 IN NS b.gtld-servers.net.
net. 172800 IN NS a.gtld-servers.net.
;; Received 489 bytes from 198.41.0.4#53(198.41.0.4) in 136 ms

oschina.net. 172800 IN NS ns1.dnsv2.com.
oschina.net. 172800 IN NS ns2.dnsv2.com.
;; Received 205 bytes from 192.52.178.30#53(192.52.178.30) in 558 ms

my.oschina.net. 86400 IN CNAME www.oschina.net.
oschina.net. 7200 IN NS ns1.dnsv2.com.
oschina.net. 7200 IN NS ns2.dnsv2.com.
;; Received 115 bytes from 183.60.59.230#53(183.60.59.230) in 15 ms

DNS有一点令人担忧,这就是像www.taobao.com这样的整个域名看上去只是对应一个单独的IP地址,那么三个IP肯定对于大访问量和不同地域的访问来说就会有较大的延迟。还好,有几种方法可以消除这个瓶颈:

  • 循环DNS 是DNS查找时返回多个IP时的解决方案。举例来说,taobao.com实际上就对应了多个IP地址。

  • 负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。

  • 地理 DNS 根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。

  • Anycast 是一个IP地址映射多个物理主机的路由技术。 美中不足,Anycast与TCP协议适应的不是很好,所以很少应用在那些方案中。

大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。

最后给出一个查询DNS过程的图:

最终获取的域名对应IP为112.124.5.74,此时浏览器发起向112.124.5.74的请求,端口为80,请求资源为/u/128568/blog,发送一条HTTP GET的报文,下面看下浏览器请求的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Remote Address:112.124.5.74:80
Request URL:http://my.oschina.net/u/128568/blog
Request Method:GET
Status Code:200 OK

#请求头信息
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Cookie:
oscid=Zka95GnBtcz%2FTWwBZdIK1f%2BrZzKNNUN0vu5av2CocDrEpbLcUPBTht%2FIFGWopqXUjIysP943EaQtn4%2FJdlcX%2FOW65EUP%2Fgo7fzPdxBwqLALbq7SVBQoTFw%3D%3D
Host:my.oschina.net
User-Agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36

#响应头信息
Response Headers
Cache-Control:must-revalidate, no-cache, private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html;charset=UTF-8
Date:Sun, 25 May 2014 05:23:43 GMT
Expires:Sun, 1 Jan 2000 01:00:00 GMT
Pragma:no-cache
Server:Tengine/1.4.6
Transfer-Encoding:chunked
Vary:Accept-Encoding

从请求和响应可以看到很多信息,比如使用GET,响应为200,传输使用了压缩gzip等等,需要说明的是最后这个Connection:keep-alive,是为了兼容HTTP1.0设置的,用来告诉服务器使用持久连接。

文章目录
  1. 1. 从输入URL到页面加载完成的过程-DNS解析域名过程
,