HTTP学习三:其他知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhanghuiqi205/article/details/84562535

1.请求方法的阐述:

http协议中定义了7种请求方法,分别如下:
GET:最常用的请求方法,通常用于请求服务器发送某个资源
HEAD:HEAD方法和GET方法的行为类似,但是服务器只会在响应中返回头部。不会返回实体的主体部分。这就允许了客户端在不获取资源实体的情况下,对资源的首部进行检查。一般会在如下的情况中使用HEAD:
-在不获取资源的情况下,了解资源的具体情况
- 判断某个资源是否存在
- 通过查看首部,判断某个资源是否发生过更改
PUT:这个方法会向服务器写入文档。这个方法的语义就是让服务器用请求的主体部分来创建一个由所请求的url命名的文档。
POST:用来向服务器输入数据的。
TRACE:这个方法主要用于诊断。用来验证请求是否如愿的穿过了请求/响应链。这个方法是不能带有实体的主体部分。
OPTIONS:请求服务器所支持的各种功能。
DELETE:请求服务器删除指定url所指向的资源。

2.http缓存的介绍:

在具体了解 HTTP 缓存之前先来明确几个术语:

  • 缓存命中率:从缓存中得到数据的请求数与所有请求数的比率。理想状态是越高越好。
  • 过期内容:超过设置的有效时间,被标记为“陈旧”的内容。通常过期内容不能用于回复客户端的请求,必须重新向源服务器请求新的内容或者验证缓存的内容是否仍然准备。
  • 验证:验证缓存中的过期内容是否仍然有效,验证通过的话刷新过期时间。
  • 失效:失效就是把内容从缓存中移除。当内容发生改变时就必须移除失效的内容

简单的介绍一下`http缓存`的整个过程:

首次访问一个url的时候,浏览器中是不存在缓存的。当服务器响应的时候,会响应一些控制浏览器缓存行为的header。比如:expires,cache-control,last-modified,etag等。这写响应头部主要是用来控制浏览器对资源是否缓存,如何缓存等。


当再次访问相同的url的时候,浏览器会根据上面的这个header信息,来决定是否向服务器发送请求。


下面主要介绍的就是浏览器再次访问一个url的时候,如何根据缓存来决定请求的行为。


第一个条件:当浏览器再次访问一个url的时候,会首先根据header信息判断这次请求是否命中强缓存(expires和cache-control)。如果命中了强缓存,就会直接从浏览器中读取缓存的资源,而不会向服务器发送请求。否则,就进行第二个条件的判断。
第二个条件:如果没有命中强缓存,浏览器会向服务器发送请求,请求会携带第一次请求时候服务器所返回的一些header信息(Last-Modified/If-Modified-since和ETag/if-none-match)。服务器在接收到请求的时候,会根据这些header中的信息来判断请求的资源是否命中了协商缓存。如果命中了协商缓存,服务器会发送304状态码和空的响应体给客户端。否则,服务器就会发送200的状态码和新的响应体及新的header给客户端。

强缓存和协商缓存的区别:
- 强缓存:从缓存中读取数据,不会向服务器发送请求,200状态码
- 协商缓存:从缓存中读取数据,会向服务器发送请求并判断资源的有效性,返回200或者304的状态码。

强缓存相关的header
  expires:这个字段的值是一个表示绝对时间的字符串。如果发送请求的时间在这个值设定的时间之前,那么本地的缓存是始终有效的,不需要向服务器发送请求获取新的资源。
cache-control:max-age=xxx,浏览器会利用这个字段的max-age值来判断资源的有效性。这个值是一个相对时间。资源第一次请求的时间和max-age值来确定一个有效期。如果请求的时间在这个有效期之前,那么就可以认定资源是有效的。不必再向服务器发送请求获取新的资源。除了`max-age`,这个字段还可能有其他的值。
no-cache:不使用强缓存,使用协商缓存。每次请求都会向服务器确定资源的有效性。
no-store:禁止使用缓存,每次都要向服务器发起新的请求,获取最新的资源
public:可以被所有的用户缓存,包括终端用户和中间的cdn代理服务商
private:只能被终端的用户缓存,不允许cdn等代理服务器对其进行缓存

协商缓存相关的header:
和协商缓存相关的响应头主要有last-modified和etag两种,响应头主要有if-modified-since和if-none-match两种。其中last-modified和if-modified-since相对应,etag和if-none-match相对应。

1. last-modified和if-modified-since:
这两个字段的值都是`GMT`格式的字符串。这组字段在确定缓存是否有效的过程如下:
浏览器第一次向服务器请求一个资源的时候,服务会在响应头中加入last-modified字段。这个字段表示请求的资源在服务器上最后的修改时间。
当浏览器再次向服务器请求这个资源的时候,就会在请求的header中加入if-modified-since字段。这个字段的值就是第一次请求资源的时候,服务器的响应头last-modified的值。

当服务器再次收到对这个资源的请求的时候,就会通过请求头中的if-modified-since字段的值和资源最后一次被修改的时间做对比。如果两者一致,就返回304 not modified和空的响应体。如果两者不一致,就会返回对应的资源。如果服务器返回了304状态码,并不会再次向响应头中添加last-modified。因为资源并没有发生改变,上次的last-modified的值依然有效。
浏览器在收到304的响应的时候,就会从缓存中读取数据。
如果浏览器收到了200的响应,表示协商缓存没有命中。浏览器在接收新的资源的同时也会同步更新对应的last-modified的值。以便下次请求的时候启用新的last-modified。

etag和if-none-match:
etag是服务器对每个资源生成的一个唯一表示符,只要资源发生变化,这个也会随之改变。这组字段的验证过程和上述类似,唯一不同的就是服务器在进行响应的时候,依然会把etag作为响应头的一部分进行响应,及时这个值没有发生变化。

对于协商缓存的这两组字段,服务器会优先验证etag。当etag验证一致的情况下才会对last-modified进行验证。这是因为有些资源是不太适合生成etag的,比如图片资源。根据上述的判断才会决定是否要返回304的响应。

关于 last-modified 和 Etag 区别,已经有很多人总结过了:

  • 某些服务器不能精确得到资源的最后修改时间,这样就无法通过最后修改时间判断资源是否更新。
  • Last-modified 只能精确到秒。
  • 一些资源的最后修改时间改变了,但是内容没改变,使用 Last-modified 看不出内容没有改变。
  • Etag 的精度比 Last-modified 高,属于强验证,要求资源字节级别的一致,优先级高。如果服务器端有提供 ETag 的话,必须先对 ETag 进行 Conditional Request。

3.https的介绍

https在传输数据之前需要客户端和服务器进行一次握手。握手的过程中会确立双方加密传输数据的密码信息。TLS/SSL使用了对称加密,非对称加密,以及HASH算法。下面是握手的简单的过程:
1. 浏览器将自己支持的一套加密规则发送给服务器
2. 服务器从中选出一组加密算法和hash算法,并将自己的身份信息以证书的形式发送给浏览器。证书中包含了网站的网址,加密的公钥以及证书的颁发机构等信息。
3. 浏览器在收到服务器的证书之后需要做如下几件事情:
- 验证证书的合法性。如果证书受信任,浏览器地址栏里会显示一个小锁头,否则会给出不受信任的提示
- 如果证书受信任,或者用户接受了不受信任的证书,浏览器会生成一段随机数密码,并使用证书中提供的公钥加密。
- 使用之前约定好的hash算法计算握手信息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站
4. 网站接收到浏览器发送来的数据之后需要做如下几件事情
- 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致
- 使用密码加密一段握手消息,发送给浏览器
5. 浏览器解密并计算握手消息的hash,如果和服务器发送过来的hash一致,此时握手过程结束。之后所有的通信将使用之前浏览器生成的随机密码,并使用对称加密算法进行加密
http协议和https协议的区别:
https协议需要申请ca证书,一般免费证书很少,需要交费
http是明文传输数据的,https则是具有安全性的ssl加密传输协议
https的默认端口是443, http的默认端口是80
https是ssl+http,比http更安全一些

4.实际的应用:

考虑缓存的内容:

  • css样式文件
  • js文件
  • logo、图标
  • html文件
  • 可以下载的内容

一些不应该被缓存的内容:

  • 业务敏感的 GET 请求

可缓存的内容又分为几种不同的情况:

不经常改变的文件:

给 max-age 设置一个较大的值,一般设置 max-age=31536000

比如引入的一些第三方文件、打包出来的带有 hash 后缀 css、js 文件。一般来说文件内容改变了,会更新版本号、hash 值,相当于请求另一个文件。

标准中规定 max-age 的值最大不超过一年,所以设成 max-age=31536000。至于过期内容,缓存区会将一段时间没有使用的文件删除掉

可能经常需要变动的文件:

Cache-Control: no-cache / max-age=0

比如入口 index.html 文件、文件内容改变但名称不变的资源。选择 ETag 或 Last-Modified 来做验证,在使用缓存资源之前一定会去服务器端做验证,命中缓存时会比第一种情况慢一点点,毕竟还要发请求进行通信。

自己使用的感悟:更多的是理解各个字段的含义(无论是字段还是code码),利用好浏览器这个好的帮手。

  • Accept-Language:表示浏览器所支持的语言类型。(这里指中文、简体中文和英文)
  • Cache-Control:指定请求和响应遵循的缓存机制。(这里表示不需要缓存)
  • Connection:表示是否需要持久连接。(HTTP 1.1 默认进行持久连接即为 keep-alive, HTTP 1.0 则默认为 close)
  • Cookie:用于会话追踪,在本文后面就继续介绍。
  • Host:表示请求的服务器网址
  • User-Agent:用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
  • Date:原始服务器消息发出的时间。
  • Last-Modified:请求资源的最后修改时间。
  • Expires:响应过期的日期和时间,如果下次访问在时间允许的范围内,可以不用重新请求,直接访问缓存。
  • Set-Cookie: 设置Http Cookie,下次浏览器再次访问的时候会带上这个 Cookie 值。
  • Server:服务器软件名称,常见的有 Apache 和 Nginx

http2的介绍,放在下一篇文章中介绍。

猜你喜欢

转载自blog.csdn.net/zhanghuiqi205/article/details/84562535