HTTP实用指南 | 青训营笔记

73 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第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,告诉浏览器直接用缓存。

参考

HTTP实用指南 (1.6w字)浏览器灵魂之问,请问你能接得住几个?