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连接,完成3次握手后,即可向网站请求数据(通常使用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,p_w_picpath/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等等,这些文件加载完毕,页面才算真正的加载完毕。