第一章 深入web请求过程
B/S架构带来了以下两方面的好处:
(1) 客户端使用同一个的浏览器。浏览器有统一性,不需要特殊的配置。浏览器的交互性使得用户使用它非常简单。
(2) 服务端基于统一的HTTP。和传统的C/S架构使用自定义应用层协议不同,B/S架构使用HTTP。使用HTTP也为服务提供商
简化了开发模式,使得服务器开发者可以采用相对规范的开发模式,节省开发成本。基于HTTP的服务器有很多,Apache, IIS, Nginx, Tomcat,
JBoss等。这些服务器可以直接拿来使用,不需要单独来开发。
1.1 B/S 网络架构概述
B/S基于统一的应用层协议HTTP来交互数据,与传统的C/S互联网引用采用长连接不同,HTTP采用无状态的短连接的通信方式,通常,一次请求就完成一次数据交互。这种方式能同时服务多用户。
当用户在浏览器输入URL回车后,将会发生很多操作。首先它会请求DNS把这个个域名解析成对应的IP地址,然后根据IP地址找到对应的服务器,向这个服务器发起一个get请求,服务返回数据资源给访问的用户。
服务器可能有很多台,到底用哪一台来处理请求,这需要一个负载均衡设备来平均分配用户请求;
请求的数据是存储在分布式缓存里还是一个静态文件中,或是在数据库中;
当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如CSS,JS或者图片)时又会发起另外的HTTP请求,而这些请求的静态资源很可能在CDN上,那么CDN服务器又会处理这个用户的请求。
不管网络结构如何,始终有一些固定不变的原则:
(1) 互联网上所有的资源都要用一个URL来表示。
(2) 必须基于HTTP与服务器端交互。
(3) 数据展示在浏览器端。
1.2 如何发起一个请求
如何发起一个HTTP请求和如何建立一个Socket连接区别不大,只不过outputStream.write写的二进制字节数据格式要符合HTTP。浏览器在建立Socket之前,必须根据地址栏里输入URL的域名DNS解析出IP地址,再根据这个IP地址和默认的80端口号与远程服务器建立Socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。
发起一个HTTP请求的过程就是建立一个Socket通信的过程。
既然发起HTTP请求就是建立Socket连接的过程,那么我们可以模拟浏览器来发起HTTP请求,如HttpClient就是一个开源的通过程序实现的处理HTTP请求的工具包。
Linux中的curl, curl + URL 就可以简单的发起一个HTTP请求。
1.3 HTTP解析
HTTP header控制浏览器的渲染请求和服务器的执行逻辑。
1.3.1 查看HTTP信息的工具
1.3.2 浏览器缓存机制
CTLR+F5组合键会刷新页面,会直接向URL发送请求,而不会使用浏览器缓存的数据
用CTLR+F5组合键后,请求头中增加了两个请求项:Pragma:no-cache和Cache-control:no-cache
1. Progma:no-cache 和 Cache-Control:no-cache
Cache-control请求字段被浏览器支持的比较好,而且优先级比较高,它和其他一些请求字段(如Explries)同时出现时,Cache-control会覆盖
其他字段。
Pragma字段的作用和Cache-control有点类似,Pragma:no-cache和Cache-control:no-cache作用一样。
2. Expires
Expires: Sat, 25 Feb 2012 12:22:17 GMT.
超过这个时间,缓存失效,浏览器发送请求的时候会检查这个字段,如果页面过期就重新向服务器发送请求。
3. Last-Modified/Etag
表示服务器上资源的最后修改时间,通过这个字段可以检查资源是否是最新的。
服务器一般在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间。浏览器再次请求时在请求头中增加if-Modified-Since: XXXX, 询问当前缓存的页面是否是最新的,如果是最新的就返回304,告诉浏览器是最新的,不用拿新数据。
与last-Modified字段有类似功能的还有一个Etag字段,这个字段的作用是让服务器给每一个页面分配一个唯一的编号,通过这个编号来区分当前页面是否是最新的,这种方式比last-modified更加灵活,但是如果后端有多个server的话就比较难处理。
1.4 DNS域名解析
1.4.1 DNS域名解析过程
将域名解析成IP地址就是DNS域名解析的工作范畴。目前世界上真个互联网有几个DNS根域名服务器,任何一台坏掉,后果都很严重。
1.浏览器可以缓存域名,域名被缓存的时间限制通过TTL属性设置。
2.操作系统也可以缓存域名(黑客正式利用修改操作系统的域名映射表解析到指定的IP地址上,导致域名被劫持。windows 7将hosts文件设置成只读的,防止被篡改)
3. 如何知道域名服务器呢?网络配置中有。本地域名服务器,一般在学校或者移动,联通等。用ipconfig可查到。大约80%的域名解析到这里就完成了。
4. 如果LDNS没有命中,就直接到Root Server域名服务器请求解析。Root Server返回主域名服务器。
... ...
1.4.2 跟踪域名解析过程
nslookup
1.4.3 清除缓存的域名
两个地方缓存: LDNS 和 用户的机器。
windows下可以通过ipconfig/flushdns刷新缓存。
1.4.4 几种域名解析方式
略
1.5 CDN工作机制
CDN也就是内容分布网络(Content Delivery Network),一种流量分配网络,在现有internet增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,让用户可以就近取得所需内容
当前CDN以缓存网络中的静态数据为主,如CSS,JS,图片和静态页面等数据。用户从主站服务器得到动态内容后,再从CDN得到静态内容,从而加速网页数据内容的下载速度,淘宝有90%的数据是从CDN提供的。
1.5.1 CDN架构
当访问一个静态资源的时候,通过DNS会把请求解析成CDN全局中的DNS负载均衡服务器,返回一个最近的CDN服务器。
1.5.2 负载均衡
对工作任务进行平衡、分摊到多个操作单元上执行。
三种负载均衡:链路负载均衡, 集群负载均衡, 操作系统负载均衡。
1.5.3 CDN动态加速:
CDN动态加速技术是当前比较流行的一种优化技术,它的技术原理就是在CDN的DNS解析中通过动态的链路探测来寻找回源最好的一条路径,然后通过DNS的调度将所有请求调度到选定的这条路径上,从而加速用户访问效率。