Web请求过程

 

一、B/S网络架构概述


B/S网络架构基于统一的应用层协议 HTTP来交互数据,与大多数的传统 C/S互联网应用程序采用的长连接的交互模式不同,HTTP采用无状态的短连接的通信方式。一次请求就完成一次数据交互,然后通信就断开。采用这种方式能够同时服务更多的用户,因为当前互联网应用每天都会处理上亿的用户请求,不可能每个用户访问一次后就一直保持这个链接。B/S架构设计如下:既要满足海量用户的访问请求,又要保持用户请求的快速响应。(当浏览器解析服务器返回的数据时,会发现还有一些静态资源,如:CSS/JS/imager等时又会发起另外的 HTTP请求,而这些请求很可能会在CDN上,那么 CDN服务器又会处理这个用户的请求)

二、浏览器缓存机制


开发过程中,为了防止缓存问题。一般会按Ctrl+F5组合键重新请求页面,此时浏览器会直接向目标URL发送请求,不会使用浏览器缓存数据;其次即使请求发送到服务端,也有可能访问到的是缓存数据,比如:应用服务器的前端部署一个缓存服务器,如Varnish代理,那么Varnish也可能直接使用缓存数据。所以为了保证用户能够看到最新的数据,必须通过HTTP来控制。
当我们使用Ctrl+F5组合键刷新一个页面时,在HTTP的请求头中会增加一些请求头信息,它告诉服务端我们要获取最新的数据而不是缓存。(新增了Cache-Control和Pragma两个字段)

 Cache-Control/Pragma:这个HTTP Head 字段用于指定所有缓存机制在整个请求头/响应链中必须服从的命令,不仅可以控制浏览器,还可以控制和HTTP相关的缓存或代理服务器。HTTP Head字段有一些可选值。

可选值 说明
Public 所有内容都被缓存,在响应头中设置。
Private 内容只缓存到私有缓存,在响应头中设置。
no-cache 所有内容都不会被缓存,在请求头中设置。
no-store 所有内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置。
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置。
max-age=xxx 缓存内容在xxx秒后失效,在响应头中设置。

 ● Cache-Control请求字段被各个浏览器支持得较好,而且它的优先级也比较高,它和其他一些请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段。
 ● Pragma字段的作用和Cache-Control有点类似,它也是在HTTP头中包含一个特殊的指令,使相关服务器遵守该指令,最常用的就是Pragma:no-cache,它和Cache_Control:no-cache的作用是一样的。

三、DNS域名解析


一旦DNS解析出错,可能会导致非常严重的互联网灾难。目前世界上整个互联网就有几个DNS根域名服务器,任何一台服务器坏掉,后果都会非常严重。DNS域名解析的主要请求过程实例图:
  ​      
当用户输入URL时,DNS解析过程如下(结合实例图):
第一步,浏览器会检查缓存中有木有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存对域名的大小和缓存时间也是有限制的,可通过TTL设置。缓存时间应当设置合理,缓存时间太长,一旦解析到的IP有变化,会导致客户端无法解析到变化后的IP,缓存时间太短,会导致用户每次访问网站都要重新解析一次域名。
第二步,如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否存在这个域名对应的DNS解析结果。其实操作系统也有一个域名解析过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,你可以将任何域名解析到任何能访问的IP地址。如果在此设置了域名对应的IP地址,那么浏览器会首先使用这个IP地址。所以黑客就有可能修改你的域名解析来吧特定域名解析到它指定的IP地址上,导致这些域名被劫。
第三步,我们的网络配置中都会有“DNS服务器地址”这一项,当前面未解析成功,操作系统会把域名发送到LDNS,也就是本地的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务。例如你是通过电信接入互联网的,那么这个DNS就是提供给你接入互联网的电信应用供应商,也就是常说的SPA,那么这个DNS通常会在你所在城市的摸个角落,通常不会太远。Windows下可以通过ipconfig查询,Linux中可以通过DNS Server查询。
第四步,如果LDNS仍然没有命中,就直接到Root Server 域名解析器请求解析。
第五步,根域名服务器返回给本地域名服务器一个查询域的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如com、cn、org等,全球只有13台左右。
第六步,本地域名服务器(Locak DNS Server)再向上一步返回的gTLD服务器发送请求。
第七步,接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
第八步,Name Server域名服务器会查询存储的域名和IP的映射关系表,得到IP和TTL值返回给DNS Server域名服务器。
第九步,返回域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP对应关系,缓存的时间有TTL值控制。
第十步,把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
在Linux系统中还可以使用dig命令来查询DNS的解析过程。

四、CDN工作机制


CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有Internet上的一种先进的流量分配网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
目前CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等数据。用户在从主站服务器请求到动态内容后,再从CDN上下载静态资源,从而加速网页数据内容的下载速度,如淘宝90%以上的数据都是有CDN来提供的。
通常来说CDN要达到一下几个目标:
      ●  可扩展(Scalability):性能可扩展性,应对新增的大量数据、用户和事务等具有扩展能力。成本可扩展:用低廉的运营成本提供动态的服务能力和高质量的内容服务。
      ●  安全性(Security):强调提供物理设备、网络、软件、数据和服务过程的安全性,减少因为DDos攻击或者其他恶意行为造成商业网站的业务中断。
      ●  可靠性、响应和执行(Reliablility、Responsiveness和Performance)。服务可用性指能够处理可能的故障和用户体验下降的问题,通过负载均衡及时提供网络的容错机制。
CDN架构图:

如上图,一个用户访问静态文件时,首先要想Local DNS服务器发起请求,一般迭代解析后回到这个域名的注册服务器去解析,一般每个公司都会有一个DNS解析服务器。这时这个DNS解析服务器通常会把它重新CNAME解析到另外一个域名,而这个域名最终会被指向CDN全局中的DNS负载均衡服务器,再由这个GTM来最总分配是哪个地方的访问用户,返回给离这个访问用户最近的CDN节点。拿到DNS解析结果,用户就直接去这个CDN节点访问这个静态文件了,如果这个节点中所请求的文件不存在,就会回到源站去获取这个文件,然后在返回给用户。

五、CDN动态加速


CDN的动态加速技术也是当前比较流行的一种优化技术,它的技术原理就是在CDN的DNS解析中通过动态的链路探测来寻找回源最好的一条路径,然后通过DNS的调度将所有请求调度到选定的这条路径上回源,从而加速用户访问的效率。

由于CDN节点是遍布全国的,所以用户接入一个CDN节点后,可以选择一条从离用户最近的CDN节点到源站链路最好的路径让用户走。一个简单的原则就是在每个CDN节点上从源站下载一个一定大小的文件,看哪个链路的总耗时最短,这样可以构成一个链路列表,然后绑定到DNS解析上,更新到CDN的Local DNS。当然是否走这个链路并不一定根据耗时这个唯一条件,有时也要考虑网络成本,例如走某个节点虽然可以节省10ms,但网络带宽的成本却增加了很多,还有其他网络链路的安全等因素也要综合考虑。

posted @ 2020-11-21 21:07  Java程序员进阶  阅读(514)  评论(0编辑  收藏  举报