这是我参与「第四届青训营 」笔记创作活动的第4天 。
1.什么是HTTP协议
Hyper Text Transfer Protocol:超文本传输协议 是应用层协议,基于TCP协议
2.协议分析
2.1方法:
| Method | 描述 |
|---|---|
| GET | 请求一个指定资源,用于获取数据 |
| POST | 用于将实体提交到指定资源,通常导致在服务器上的状态变化或副作用 |
| PUT | 用于请求有效载荷替换目标资源 |
| DELETE | 删除指定资源 |
| HEAD | 请求一个与GET请求的响应相同的响应,但没有响应体 |
2.2状态码:
- 1xx:表示请求已接收,继续处理。
- 2xx:表示成功。 如200 OK 客户端请求成功
- 3xx:表示重定向,要完成请求必须进行进一步操作。如:
- 301-资源被永久转移到其他URL;
- 302-临时跳转
- 4xx:客户端错误。
- 401-请求未经授权 Unauthorized
- 404-请求资源不存在,可能输入了错误的URL
- 5xx:服务器端错误。
- 500-服务器内部发生了不可预期的错误
- 504-网关或代理服务器无法在规定时间内获得想要的响应 Gateway Timeout
2.3缓存
2.3.1强缓存
浏览器中的缓存作用分为两种情况,一种需要发送HTTP请求,一种是不需要发送。
首先是通过字段检查强缓存,这个阶段不需要发送HTTP请求。
在HTTP/1.0和HTTP1.1当中,这个字段是不一样的。在1.0时期,使用Expires,而在1.1,使用的是Cache-Control。
Expire
即过期时间,存在于服务端返回的响应头中,告诉浏览器在这个过期时间之前可以直接从缓存里面获取数据。
Expires: Wed, 22 Nov 201 08:41:00 GMT
这个方式看上去没什么问题,但是潜藏了一个坑:服务器时间和浏览器时间可能并不一致,则服务器返回的时间可能就不准确,因此被抛弃了
Cache-Control
在HTTP1.1中,采用了一个非常关键的字段:Cache-Control。存储过期时长来控制缓存,对应字段为max-age
Cache-Control:max-age=3600 //代表这个响应返回后3600秒可以使用缓存
除max-age外,其他关键属性列举如下:
public:客户端和代理服务器都可以缓存
private:只有浏览器能缓存,代理服务器不能
no-cache:跳过当前强缓存,发送HTTP请求,直接进入协商缓存阶段
no-store:不进行缓存
s-maxage:代理服务器缓存时间
2.3.2协商缓存
强缓存失效之后,浏览器在请求头中携带相应的缓存tag来向服务器发送请求,由服务器根据这个tag,来决定是否缓存,这就是协商缓存。具体来说,这样的缓存tag分为两种:Last-Modified 和 ETag 这两者各有优劣,并不存在绝对优势
Last-Modified
最后修改时间。在浏览器第一次给服务器发送请求后,服务器会在响应头中加上这个字段。
浏览器接收到后,如果再次请求,会在请求头中携带If-Modified-Since字段,这个字段的值就是服务器传来的最后修改时间。
服务器拿到请求头中的If-Modified-Since字段后,会和服务器中该资源的最后修改时间做对比,如果请求头中的这个值小于最后修改时间,说明是时候更新了,返回新的资源,跟常规的HTTP请求响应流程一样;否则返回304,告诉浏览器直接用缓存
ETag
ETag是服务器根据当前文件的内容,给文件生成的唯一标识。类似于指纹
浏览器接收到ETag的值,会在下次请求时,将这个值作为If-None-Match这个字段的内容,并放到请求头中,然后发给服务器。
服务器接收到If-None-Match后,会跟服务器上该资源的ETag进行比对: 如果两者不一样,说明要更新了。返回新的资源,跟常规的HTTP请求响应的流程一样;否则返回304,告诉浏览器直接用缓存。