(点击图片查看大图)
本文将详细介绍从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程。
1. 用户在浏览器地址栏输入www.yy.com或yy.com。
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文本进行解析,并展示到屏幕上,最终用户看到网站的页面。
注:到达这一步后,页面的基本框架已经展现出来,但由于不同浏览器的编码差异,最终展示结果可能不完全一致(即兼容性问题)。接下来页面会请求一些内嵌对象,如CSS、jpg、swf等文件,这些文件加载完毕后,页面才算真正加载完毕。