wKioL1NMyrGRD2oeAALBGbXc6Q4283.jpg

(点击图片查看大图)

本文将详细介绍从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程。

1. 用户在浏览器地址栏输入www.yy.com或yy.com。

wKiom1NMy3zDGH34AAD-KKCiOt4160.jpg

2. 系统首先检查各种缓存,包括浏览器缓存、操作系统缓存、路由器缓存、ISP DNS缓存、Local DNS缓存等。如果在缓存中找到对应的记录,则直接返回IP地址(通常是CDN节点IP)。

3. 如果缓存中未找到相关记录,系统将请求DNS服务器进行解析。解析过程从根DNS服务器开始,逐级查询到子DNS服务器,直到找到相应的记录,然后返回IP地址。在CDN网络中,域名通常通过CNAME记录指向CDN的中心管理节点,该节点通过智能DNS解析到离用户最近的数据节点。

4. 用户获取到最近的CDN节点IP后,发起TCP连接,完成三次握手后,向网站请求数据(通常使用GET或POST方法)。请求报文如下:

# Request Headers
GET /  HTTP/1.1
Host:  www.yy.com
Connection:  keep-alive
Cache-Control:  max-age=0
Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent:  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36
Accept-Encoding:  gzip,deflate,sdch
Accept-Language:  zh-CN,zh;q=0.8
COOKIE:  hiido_ui=0.7241391350980848; Hm_lvt_34a908ea88275f6ef0a72588f9c0be86=1396519725,1396581763,1397182316,1397456466; Hm_lpvt_34a908ea88275f6ef0a72588f9c0be86=1397462995; JSESSIOnID=6356FE3EB09603FB845B00FE2A317935; BA=l=37&le=0.53&ip=

字段解释:

GET // 获取www.yy.com内容

User-Agent // 浏览器标识

Accept // 浏览器能接受的响应类型

Accept-Encoding // 浏览器能接受的数据编码类型

Connection // 浏览器将对一个server的多次访问重用一个连接

COOKIE // 该浏览器中存储的此域名下的所有COOKIE值,每次请求都会发送所有COOKIE。

注:GET方式传递参数长度有限制,最多只有1024字节,而POST没有这个限制;另外GET在向网站提交数据时以明文方式发送,类似于http://www.test.jsp?name=hyddd&password=hyddd,较不安全。

5. 如果用户请求的是静态内容且在CDN上能找到缓存,则由CDN节点直接响应请求,无需请求WEB服务器拿数据。

6. 动态内容部分不能通过CDN缓存,CDN网络会在用户和源站(web服务器)之间建立专线,当用户请求动态内容时,实际还是要到源站上拿数据,但由于走的是专线,效果类似于在局域网内访问,从而达到加速的效果。

7. CDN节点接收到动态内容请求后,会请求访问源站的VIP(假设网站采用了LVS架构,基于PHP语言开发,web服务器为Nginx,数据库为MySQL,存储为共享存储设备)。调度器接收到请求后,根据调度算法从后端服务器池中选择一台服务器,并把请求分配给这台web服务器处理。Web服务器接收到请求后,将请求交给PHP-FPM处理,PHP-FPM会根据请求内容,打开相应文件,进行解析,并生成HTML文本。

8. Web服务器处理完毕后,将HTML文本响应给CDN节点。对于静态内容,CDN节点会保留一份副本,以便用户下次请求,并设置过期时间,避免资源浪费。响应报文如下:

# Response Headers
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 14 Apr 2014 08:10:24 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Content-Language: zh-CN
Expires: Mon, 14 Apr 2014 08:10:54 GMT
Cache-Control: max-age=30
Content-Encoding: gzip

9. CDN通过专线,将从web服务器上拿到的数据返回给用户(浏览器)。

10. 浏览器对HTML文本进行解析,并展示到屏幕上,最终用户看到网站的页面。

wKioL1NMy5TSv190AAHoTf1Gkak578.jpg

wKiom1NMy8njW4DeAAkd02oB6yA591.jpg

注:到达这一步后,页面的基本框架已经展现出来,但由于不同浏览器的编码差异,最终展示结果可能不完全一致(即兼容性问题)。接下来页面会请求一些内嵌对象,如CSS、jpg、swf等文件,这些文件加载完毕后,页面才算真正加载完毕。