WEB请求处理⼀:浏览器请求发起处理
最近,终于要把《WEB请求处理系列》提上⽇程了,⼀直答应⼩伙伴们给分享⼀套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应⽤程序WEB请求的⼀个处理流程,前段时间由于其他⼯作事情的安排,⼀直未进⾏整理。不过还好该系列终于启动了,给⼤家分享的同时,也顺便整理下⾃⼰的思路,以便温故⽽知新吧。希望⼤家都能在此过程中得到新的收获吧。
本系列主要分五部分:
1.《WEB请求处理⼀:浏览器请求发起处理》:分析⽤户在浏览器中输⼊URL地址,浏览器如何到服务器地址的过
程,并发起请求;
2.《WEB请求处理⼆:Nginx请求反向代理》:分析请求在达反向代理服务器内部处理过程;
3.《WEB请求处理三:Servlet容器请求处理》:分析请求在Servlet容器内部处理过程,并到⽬标应⽤程序;
浏览web是什么意思4.《WEB请求处理四:WEB MVC框架请求处理》:分析请求在应⽤程序内部,开源MVC框架的处理过程;
5.《WEB请求处理五:浏览器请求响应处理》:分析请求在服务器端处理完成后,浏览器渲染响应页⾯过程;
为直观明了,先上⼀张图,红⾊部分为本章所述模块:
本章所述模块
1 B/S⽹络架构概述#
我们先了解下B/S⽹络架构是什么?B/S⽹络架构从前端到后端都得到了简化,都基于统⼀的应⽤层协议HTTP来交互数据,HTTP协议采⽤⽆状态的短链接的通信⽅式,通常情况下,⼀次请求就完成了⼀次数据交互,通常也对应⼀个业务逻辑,然后这次通信连接就断开了。采⽤这种⽅式是为了能够同时服务更多的⽤户,因为当前互联⽹应⽤每天都会处理上亿的⽤户请求,不可能每个⽤户访问⼀次后就⼀直保持住这个连接。
1. ⾸先,浏览器会请求DNS把这个域名解析成对应的IP地址;
2. 然后,根据这个IP地址在互联⽹上到对应的服务器,建⽴Socket连接,向这个服务器发起⼀个HTTP Get请求,由
这个服务器决定返回默认的数据资源给访问的⽤户;
3. 在服务器端实际上还有复杂的业务逻辑:服务器可能有多台,到底指定哪台服务器处理请求,这需要⼀个负载均衡设
备来平均分配所有⽤户的请求;
4. 还有请求的数据是存储在分布式缓存⾥还是⼀个静态⽂件中,或是在数据库⾥;
5. 当数据返回浏览器时,浏览器解析数据发现还有⼀些静态资源(如:css,js或者图⽚)时⼜会发起另外的HTTP请
求,⽽这些请求可能会在CDN上,那么CDN服务器⼜会处理这个⽤户的请求;
以上具体流程,如图所⽰:
以上具体流程,如图所⽰
不管⽹络架构如何变化,但是始终有⼀些固定不变的原则需要遵守:
1. 互联⽹上所有资源都要⽤⼀个URL来表⽰。URL就是统⼀资源定位符;
2. 必须基于HTTP协议与服务端交互;
3. 数据展⽰必须在浏览器中进⾏;
2 HTTP协议解析#
B/S⽹络架构的核⼼是HTTP协议,最重要的就是要熟悉HTTP协议中的HTTP Header,HTTP Header控制着互联⽹上成千上万的⽤户的数据传输。最关键的是,它控制着⽤户浏览器的渲染⾏为和服务器的执⾏逻辑。
常见的HTTP请求头:
常见的HTTP请求头
常见的HTTP响应头:
常见的HTTP响应头
常见的HTTP状态码:
常见的HTTP状态码
2.1 浏览器缓存机制##
当我们使⽤Ctrl+F5组合键刷新⼀个页⾯时,⾸先是在浏览器端,会直接向⽬标URL发送请求,⽽不会使⽤浏览器缓存的数据;其次即使请求发送到服务端,也有可能访问到的是缓存的数据。所以在HTTP的请求头中会增加⼀些请求头,它告诉服务端我们要获取最新的数据⽽⾮缓存。最重要的是在请求Head中增加了两个请求项Pragma:no-cache和Cache-Control:no-cache。
1. Cache-Control/Pragma
这个HTTP Head字段⽤于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道该页⾯是否为缓存,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器。
Cache-Control/Pragma字段的可选值:
Cache-Control/Pragma字段的可选值
Cache-Control请求字段被各个浏览器⽀持的较好,⽽且它的优先级也⽐较⾼,它和其他⼀些请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段。
Pragma字段的作⽤和Cache-Control有点类似,它也是在HTTP头中包含⼀个特殊的指令,使相关的服务器来遵守,最常⽤的就是Pragma:no-cache,它和Cache-Control:no-cache的作⽤是⼀样的。
2. Expires 缓存过期时间
Expires通常的使⽤格式是Expires:Sat,25 Feb 2012 12:22:17 GMT,后⾯跟着⼀个⽇期和时间,超过这个值后,缓存的内容将失效,也就是浏览器在发出请求之前检查这个页⾯的这个字段,看该页⾯是否已经过期了,过期了将重新向服务器发起请求。
3. Last-Modified/Etag 最后修改时间
Last-Modified字段⼀般⽤于表⽰⼀个服务器上的字段的最后修改时间,资源可以是静态(静态内容⾃动加上Last-Modified)或者动态的内容(如Servlet 提供了⼀个getLastModified⽅法⽤于检查某个动态内容是否已经更新),通过这个最后修改时间可以判断当前请求的资源是否是最新的。
⼀般服务器端在响应头中返回⼀个Last-Modified字段,告诉浏览器这个页⾯的最后修改时间,如:Sat,25 Feb 2012 12:55:04 GMT,浏览器再次请求时在请求头中增加⼀个If-Modified-Since:Sat,25 Feb 2012 12:55:04 GMT字段,询问当前缓存的页⾯是否是最新的,如果是最新的就会返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据。
与Last-Modified字段有类似功能的还有⼀个Etag字段,这个字段的作⽤是让服务端给每个页⾯分配⼀个唯⼀编号,然后通过这个编号来区分当前这个页⾯是否是最新的。这种⽅式⽐使⽤Last-Modified更加灵活,但是在后端的Web服务器有多台时⽐较难处理,因为每个Web服务器都要记住⽹站的所有资源编号,否则浏览器返回这个编号就没有意义了。
3 WEB⼯作流程#
对于正常的上⽹过程,系统其实是这样做的:
浏览器本⾝是⼀个客户端,当你输⼊URL的时候,⾸先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址到IP对应的服务器后,要求建⽴TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调⽤⾃⾝服务,返回HTTP Response(响应)包;客户端收到来⾃服务器的响应后开始渲染这个Response 包⾥的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。
Web请求的⼯作原理
Web请求的⼯作原理可以简单地归纳为:
1. 浏览器通过DNS域名解析到服务器IP;
2. 客户机通过TCP/IP协议建⽴到服务器的TCP连接;
3. 客户端向服务器发送HTTP协议请求包,请求服务器⾥的资源⽂档;
4. 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语⾔的内容,那么服务器会调⽤动态语⾔的解释引
擎负责处理“动态内容”,并将处理得到的数据返回给客户端;
5. 客户机与服务器断开。由客户端解释HTML⽂档,在客户端屏幕上渲染图形结果;
⼀个简单的HTTP事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的是客户机与服务器之间的通信是⾮持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下⼀次请求。
4 DNS域名解析#
4.1 DNS域名解析过程##
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论