深入浅出系列-HTTP/HTTPS

258 阅读5分钟

HTTP

概念:http是基于TCP协议的一个无状态协议(超文本传输协议)

** 请求组成部分 ** * 请求方法 URL HTTP/版本号 * 请求首部字段(可选) * 空行 * body(只对Post请求有效)

** 响应组成部分 ** * HTTP/版本号 返回码 返回码描述 * 应答首部字段(可选) * 空行 * body

** 优缺点 **

  • http是无状态的协议,每次请求不会记录
  • 单一方向,每次需要客户端发出http请求,服务器通过http返回消息

HTTP版本

* HTTP1.0
* HTTP1.1
* HTTP2.0

HTTP缓存机制

Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存

浏览器缓存也包含很多内容: HTTP 缓存indexDBcookielocalstorage 等等。这里我们只讨论 HTTP 缓存相关内容。

Http缓存机制作为 web 性能优化的重要手段

我们知道HTTP的缓存属于客户端缓存,后面会提到为什么属于客户端缓存。所以我们认为浏览器存在一个缓存数据库,用于储存一些不经常变化的静态文件(图片、css、js等)。我们将缓存分为 强制缓存协商缓存。下面我将分别详细的介绍这两种缓存的缓存规则。

浏览器加载一个页面的简单浏览表现!!!

浏览器先根据这个资源的 http头信息 来判断是否命中 强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器 本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存


强制缓存

当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。

对于强制缓存来说,响应的header会有两个字段来标明失效规则Expires | Cache-Control

  1. Expires的值为服务器返回的到期时间,即下一次请求时,请求时间小于服务器返回的到期时间,直接使用缓存数据 注: Expires到期时间有服务器生成,也是HTTP1.0环境,基本不怎么用。现在大部分请求都是HTTP1.1, 使用Cache-Control

  2. Cache-Control 是最重要的规则,常用值有private、public、no-cache、max-age、no-store、must-revalidate默认是private

  • private: 客户端可以缓存
  • public: 客户端和代理服务器都可缓存
  • max-age=xxx 缓存的内将在XXX秒失效
  • no-cache: 需要使用对比缓存来验证缓存数据
  • no-store: 所有内容都不会缓存
  • must-revalidate 资源过期后必须重新校验

已spring spoot为例, 返回的response添加头部信息

  response.setHeader(HttpHeaders.CACHE_CONTROL, "public max-age:7200, must-revalidate");

协商缓存

又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务端验证是否失效(新鲜),如果没有失效服务端会返回304,此时客户端直接从缓存中获取所请求的数据,如果标识失效,服务端会返回更新后的数据。

对于协商缓存来说,缓存标识的传递是我们着重需要理解的,它在请求header和响应header间进行传递, 一共分为两种标识传递,接下来,我们分开介绍

1.Last-Modified : 服务器在响应请求时,告诉浏览器资源的最后请求时间

2.If-Modified-Since 再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。 服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。 若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200; 若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。


缓存优势

  1. 减少了冗余的数据传递,节省宽带流量
  2. 减少了服务器的负担,大大提高了网站性能
  3. 加快了客户端加载网页的速度 这也正是HTTP缓存属于客户端缓存的原因。

不同操作请求过程

* 浏览器输入url回车请求资源,浏览器缓存种存在,就不去继续请求
* f5告诉浏览器,别偷懒,去服务器看看这个文件是否过期,浏览器的请求就会带上If-Modify-since
* ctrl+f5 告诉浏览器先把缓存种的文件删除了,再去服务器请求文件资源


XMLHttpRequest允许在客户端发送网络请求,在XMLHttpRequest还没有出来以前,以前的网页大部分是静态,或者数据的依赖刷新页面获取, 现在通过这个实现异步无刷新获取!

包括以前jquery.ajax, 到现在的模块化axois都实现了对XMLHttpRequest的分装,之后我们两个库着重深入去了解http网络请求

跨域

想要了解跨域就要知道什么时候“同源策略”,浏览器从一个域名的网页去请求另外一个域名的资源时,域名、端口、协议任意一个就是跨域 同源策略: 是浏览器的一个安全限制,从一个源的文档或者脚本默认不能访问另外一个源的资源

网络安全

* CSRF
* XSS

HTTP相关面试考点

https://www.cnblogs.com/chenwenhao/p/11267238.html