HTTP协议 | 青训营

75 阅读3分钟

HTTP协议

什么是HTTP

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

发展

HTTP/0.9

  • 请求GET(单行协议)
  • 响应只有HTML文档

HTTP/1.0

  • 增加了Header
  • 有了状态码
  • 支持多种文档类型(html、CSS……)
  • ……

HTTP/1.1

  • 链接复用
  • 缓存
  • 内容协商
  • ……

HTTP/2

  • 二进制协议
  • 压缩header
  • 服务器推送
  • ……

HTTP/3

  • 流量控制、传输可靠性(QUIC协议)
  • 集成TLS加密功能(QUIC协议)
  • 多路复用
  • 快速握手

协议分析--报文

Method

image.png

Safe(安全的): 不会修改服务器数据的方法 -> GET HEAD OPTIONS
Idempotent(幂等): 同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。所有safe的方法都是idempotent的。 -> GET HEAD OPTIONS PUT DELETE

状态码

image.png

常见状态码:

  • 200 OK - 客户端请求成功
  • 301 - 资源(王爷等)被永久转移到其它URL
  • 302 - 临时跳转
  • 401 Unauthorized - 请求未经授权
  • 404 - 请求资源不存在,可能是输入了错误的URL
  • 500 - 服务器内部发生了不可预期的错误
  • 504 Gateway Timeout - 网关或者代理的服务器无法在规定的时间内获得想要的响应

常用请求头

image.png

常用响应头

image.png

缓存

强缓存

使用强缓存策略时,如果缓存资源有效,则直接使用缓存资源,不必再向服务器发送请求。

  • Expires,时间戳
    指定资源的过期时间。
  • Cache-Control
    • public:设置了该字段值的资源可以被任何对象(包括发送请求的客户端、代理服务器等等)缓存。这个字段值不常用,一般还是使用max-age来精确控制。
    • private:设置了该字段值的资源只能被用户浏览器缓存,不允许任何代理服务器缓存。在实际开发中,对于一些含有用户信息的HTML,通常都要设置这个字段值,避免代理服务器(CDN)缓存。
    • no-cache:设置了该字段需要先和服务器确认返回的资源是否发生了变化,如果资源未发生变化,则直接使用缓存好的资源。
    • no-store:设置了该字段表示禁止任何缓存,每次都会向服务器发起新的请求,拉取最新的资源。
    • max-age:设置了该缓存的最大有效期,单位为秒。
    • s-maxage:优先级高于max-age,仅适用于共享缓存(CDN),优先级高于max-age或者Expires头。
    • max-stale[=]:设置了该字段表示客户端愿意接收已经过期的资源,但是不能超过给定的时间限制。
    • must-revalidate:一旦资源过期,在成功向原始服务器验证之前,不能使用。

协商缓存

如果没有命中强制缓存,设置了协商缓存,就使用协商缓存。
使用协商缓存策略时,会先向服务器发送一个请求,如果资源没有发生修改,则返回一个304状态,让浏览器使用本地的缓存副本。如果资源发生了改变,则返回修改后的资源。

  • Last-Modified/If-Modified-Since: 最后修改时间。
  • Etag/If-None-Match: 资源的特定版本的标识符。

总流程图

image.png