http|青训营笔记

66 阅读4分钟

HTTP实用指南 | 青训营笔记

这是我参与「第五届青训营 」笔记创作活动的第5天

今天整理了一下在青训营中学习的HTTP协议相关的知识。

什么是HTTP

HTTP全称Hyper Text Transfer Protocol,超文本传输协议,具有以下特点

  • 应用层协议,基于TCP协议
  • 请求 响应
  • 简单可扩展
  • 无状态

http报文

请求报文
请求方法 URL HTTP/版本号 
请求首部字段(可选) 
空行 
body(只对Post请求有效)
复制代码
响应报文
HTTP/版本号 返回码 返回码描述 
应答首部字段(可选) 
空行 
body
复制代码
请求方法
GET: 获取URL指定的资源;
POST:将实体提交到指定的资源。通常会导致服务器上的状态变化
PUT:上传文件 
DELETE:删除指定资源
HEAD:获取报文首部,与GET相比,没有响应体
OPTIONS:询问支持的方法 TRACE:追踪请求的路径; 
CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信。主要使用SSL和TLS将数据加密后通过网络隧道进行传输。
复制代码
状态码
1** 指示信息,表示请求已接收,继续处理
2** 成功,表示请求已被成功接收、理解、接收
    200 OK 客户端请求成功
3** 重定向,要完成请求必须进行更进一步操作
    301 资源(网页等)被永久转移到其他URL
    302 临时跳转
4** 客户端错误,请求语法错误或请求无法实现
    401 请求未经授权
    404 请求资源不存在,可能是输入了错误的URL
5** 服务端错误,服务器未能实现合法的请求
    500 服务器内部发生了不可预期的错误
    504 网关或代理的服务器无法在规定的时间内获得想要的响应
复制代码

缓存

强制缓存

image.png

Cache-Control:

由服务端控制,若服务端感觉当前资源(如:js、css、img)可以被缓存,则会在 Response Headers 中,添加 Cache-Control

  • Response Headers 中(Request Headers中也存在)
  • 控制强制缓存的逻辑(服务端控制)
  • 例如:Cache-control: max-age = 31536000 (单位:秒)

Cache-Control 的值:

  • max-age - 缓存最大过期时间
  • no-cache - 不使用强制缓存,正常到服务器请求,不管服务端怎么处理
  • no-store(不常见) - 不使用强制缓存,也不使用服务端的一些缓存措施
  • private - 只允许最终用户做缓存,如手机、电脑、浏览器等
  • public - 允许中间的一些路由或代理也可以做缓存

关于Expires:

  • 同在 Response Headers 中
  • 同为控制缓存过期
  • 已被 Cache-Control 代替
  • 浏览器2种写法,若同时存在,以Cache-Control为主
协商缓存

image.png

  • 服务器端缓存策略(是一个策略,由服务端判断该文件是不是可以缓存,而不是缓存在服务端)
  • 服务器判断客户端资源,是否和服务端资源一样
  • 一致则返回 304,但不返回资源,否则返回 200 和最新的资源

资源标识:

在 Response Headers 中,有两种

  1. Last-Modified - 资源的最后修改时间
  2. Etag - 资源的唯一标识(一个字符串,类似人类的指纹)

注意:发送请求时 Last-modified 以 If-Modified-Sence 在 Request Headers 中发送到服务器

注意:发送请求时 Etag 以 If-None-Match 在 Request Headers 中发送到服务器

Last-Modified 和 Etag:

  • 会优先使用 Etag
  • Last-Modified 只能精确到秒级(相比计算机的毫秒级计算,还是非常宽泛的)
  • 如果资源被重复生成,而内容不变,则 Etag 更精确
缓存原理

626826fb000164de19201080-500-284.jpg

  1. 首次请求,服务器返回:状态码 200、请求资源、缓存信息(Cache-ControlLast-ModifiedEtag)、...
  2. 再次请求,请求头携带 Cache-ControlIf-Modified-SenceIf-None-Match,发现有缓存,根据Cache-Control中max-age判断缓存是否过期,没有过期,则返回:状态码 304,读取本地缓存资源(强制缓存
  3. Cache-Control过期,则判断请求头中是否有If-Modified-Sence、If-None-Match,没有则等同首次请求
  4. 有If-Modified-Sence、If-None-Match,且服务器判断缓存不可用,则等同首次请求返回
  5. 若服务器判断缓存可用,则返回:状态码 304,读取本地缓存资源(协商缓存