B/S架构的好处
- 客户端使用统一的浏览器,没有平台限制
- 服务端基于统一的HTTP协议
B/S网络架构概述
当在浏览器中输入一个www.taobao.com这个URL时:
- 请求DNS将域名解析成对应的IP地址
- 根据这个IP地址找到对应的服务器发起一个get请求,服务器决定返回默认的数据资源给访问的用户
- 服务端更复杂的业务逻辑:
- 多台服务器需要做负载均衡来平均分配用户的请求
- 请求的数据存储在分布式缓存、静态文件、数据库中
- 浏览器解析静态资源(CSS/JS/图片)时CDN内容分发网络上请求
HTTP解析
浏览器缓存机制
- 获取最近数据采用Ctrl+F5来直接向URL发送请求,不会使用缓存数据
- 如果服务器端调用了缓存服务器,如Varnish,也可能直接使用缓存数据
- 为了保证看到最新数据采用HTTP请求头中加入Cache-Control:no-cache(HTTP1.1)和Prama:no-cache(HTTP1.0)两个参数来控制,浏览器和缓存代理服务器必须服从最新的数据
常用标志
Cache-Control: public | 响应被缓存,并且在多用户间共享, (公有缓存和私有缓存的区别,请看另一节) |
Cache-Control: private | 响应只能作为私有缓存,不能在用户之间共享 |
Cache-Control:no-cache | 提醒浏览器要从服务器提取文档进行验证 |
Cache-Control:no-store | 绝对禁止缓存(用于机密,敏感文件) |
Cache-Control: max-age=60 | 60秒之后缓存过期(相对时间) |
Date: Mon, 19 Nov 2012 08:39:00 GMT | 当前response发送的时间 |
Expires: Mon, 19 Nov 2012 08:40:01 GMT | 缓存过期的时间(绝对时间) |
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT | 服务器端文件的最后修改时间 |
ETag: "20b1add7ec1cd1:0" | 服务器端文件的Etag值 |
ETag是实体标签(EntityTag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。
ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。
为什么使用ETag呢?主要是为了解决Last-Modified 无法解决的一些问题。
1.某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。
2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。
3.一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。
DNS域名解析过程
- 浏览器检查缓存中有没有域名对应的IP地址,有解析过程结束。会有一个TTL时间来决定域名被缓存的时间限制。
- 查找操作系统host文件中有无对应域名解析
- 将这个域名发送给LDNS(本地区的域名服务器)
- 如果LDNS没有命中去Root Server域名服务器请求
- RootServer返回查询域 .com .cn. org主域名服务器gTLD国际顶级域名服务器(13台)
- 请求LDNS请求gTLD发送请求
- gTLD返回对应的NameServer域名服务器(即注册的域名服务提供商的服务器)
- NameServer根据域名找IP并返回IP和对应的TTL
- 返回并在LDNS上缓存这个IP和TTL
清除域名缓存
windowsipconfig /flushdns
linux /etc/init.d/nscd restart
CDN工作机制
CDN内容分发网络,目的是通过现有的Internet将网站内容发布到最接近用户的网络边缘,是用户可以就近取得所需的内容,提高用户访问网站的响应速度。
CDN=镜像+缓存+整体负载均衡
CDN网络是在用户和服务器之间增加Cache层,将用于引导到Cache上获得源服务器的数据主要通过接管DNS实现
- 用户向浏览器提供要访问的域名
- 浏览器调用域名解析库获得CNAME该网站的别名(CDN提供商的域名),浏览器对CNAME解析IP;再次过程中使用全局负载均衡DNS解析,根据地理位置信息解析对应的IP地址保证就近访问。
- 浏览器得到IP之后向缓存服务器发送请求
- 缓存服务器根据浏览器要访问的域名通过Cache内部专用DNS解析到此域名实际的IP地址,再由缓存服务器向次此IP地址提交访问请求;
- 缓存服务器得到数据之后,A.本地缓存一份,以备下次使用,B. 将数据返回给客户端
- 客户端收到数据显示出来。