HTTP协议概览 | 青训营

90 阅读6分钟

HTTP协议

HTTP ,全称 "Hyper Text Transfer Protocol "(超文本传输协议),是一个基于TCP协议的应用层协议。

1.1 HTTP协议发展历程

  1. 最初是为了解决 chrome Server的通信需求,设计上较为简单。

    (HTTP/0.9) 特点:(1)单行协议;(2)响应承载只有HTML文档;

  2. 协议过于单调,不满足诉求,因此在原有基础上增加扩展,丰富协议内容

    (HTTP/1.0) 特点:(1)增加了Header、状态码;(2)支持多种文档类型...

  3. 扩展功能,丰富协议,提高请求效率和增强请求安全性

    (HTTP/1.1 标准化协议) 特点: 链接复用、缓存、内容协商...

  4. 优化协议,提高网络传输的效率和稳定性

    (HTTP/2) 特点:(1)二进制协议、压缩header、服务器推送...

1.2 报文分析

以HTTP/1.1报文为例子进行分析。

  1. 组成部分
  • 起始行(start-line)

    针对于请求和响应两张情况,起始行的信息不一样。

    • 请求

      起始行包含请求方法类型(Method),请求路径(Path)、协议版本信息(Version)。

    • 响应

      起始行包含协议版本信息(Version),响应状态码(StatusCode)、响应信息(StatusMessage)。

  • 头部(header)

    头部的信息也分请求、响应不同情况:

    • 请求

      请求头中包含的属性一般是与传送数据类型(客户端发送数据类型)、接收数据类型(浏览器支持MIME类型)、缓存信息、附带信息(用户信息、登录状态等)、请求来源相关等字段。

    • 响应

      响应头中包含返回数据类型、缓存相关、都武器相关数据等字段。

    • 空行(empty line)

    • 请求体(body) 请求体一般是本次网络请求携带的数据。

  1. 字段延申
  • Method

    方法类型请求语义
    GET请求一个指定资源的表示形式.使用GET的请求应该只被用于获取数据
    POST用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
    PUT用请求有效载荷替换目标资源的所有当前表示
    DELETE删除指定的资源
    HEAD请求一个与GET请求的响应相同的响应,但没有响应体
    CONNECT建立一个到由目标资源标识的服务器的隧道
    OPTIONS用于描述目标资源的通信选项
    TRACE沿着到目标资源的路径执行一个消息环回测试
    PATCH用于对资源应用部分修改
    1. 安全性
      一个请求是否是安全的,关键看该请求的请求方法是否会修改服务器的数据。不会修改服务器数据的请求被定义是安全,例如GET、HEAD、OPTIONS。
    2. 幂等性
      幂等性是指同样的请求被执行一次或连续执行多次结果是一样的,服务器的状态也不会改变。 补充: 安全的请求方法是幂等的,因为这些请求不会改变服务器数据。除此之外,PUT、DELETE也是幂等的方法。
  • 状态码
    响应数据中的起始行会标识状态码,不同的状态码有不同的代表含义。在开发过程中可以通过对响应数据里的状态码进行判别做不同的逻辑处理。

1692887206544.jpg

拓展:
一些常见的状态码如下:

  1. 200 OK ——客户端请求成功
  2. 301 —— 资源(网页等)被永久转移到其它URL
  3. 302 —— 临时跳转
  4. 401 Unauthorized —— 请求未经授权
  5. 404 —— 请求资源不存在,可能是输入了错误的URL
  6. 500 —— 服务器内部发生了不可预期的错误
  7. 504 Gateway Timeout —— 网关或者代理的服务器无法在规定的时间内获得想要的响应
  • 缓存
    缓存的类型 缓存包括强缓存和协商缓存两种类型。

    1. 强缓存
      强缓存的情况下,浏览器本地缓存有资源就可以直接使用,强缓存的设置与响应数据中的Expire、Cache-Control等字段有关。
    • Expire 代表到期时间,属性值是时间戳。
    • Cache-Control
      • 可缓存性
        • no-cache:可以使用该缓存,但需要通过协商缓存验证一下资源的时效性和可用性。
        • no-store:不使用任何缓存 ...
      • 到期
        • max-age :单位是秒,表示相对于请求的时间起始的资源存储的最大周期。
      • 重新验证/加载
        • must-revalidate:一旦资源过期,在成功向原始服务器验证之前,不能使用

    2.协商缓存
    协商缓存的情况下,浏览器使用缓存需要先和服务端进行协商沟通,协商缓存的设置与响应数据中的Etag/If-None-Match 、 Last-Modified/if-Modified-Since 等字段有关。

    • Etag/If-None-Match : 资源的特定版本的标识符,类似于指纹

    • Last-Modified/if-Modified-Since : 最后修改时间

    1. 缓存的使用
      网站开发正确地使用缓存可以有效地减少网络宽带的损耗、降低服务器压力、减少网络延迟,加快页面的打开速度,提升用户的使用体验。浏览器发送请求时使用缓存的过程如下:

      1.浏览器发送请求时,其内核会先检查本地是否存在缓存资源。

      2.若存在则判断强缓存是否有效,若有效,则直接读取资源将资源返回给浏览器;若无效,则检查上次响应头中是否有Etag(有关协商缓存的信息);

      3.若上次缓存中存在Etag, 则在发送请求的时候,在请求头中带上If-None-Match字段携带Etag的值。此时,服务端会验证Etag是否是最新的。

      • 若是最新的资源,就会返回一个状态码为304的响应数据,表明资源未被修改,可直接使用本地缓存;
      • 若不是最新可用的资源,则会返回一个状态码为200 OK ,并携带新资源的响应数据给浏览器进行协商缓存。

      4.若上次缓存不存在Etag,则检查上次响应头中是否含有Last-Modified字段。

      • 若存在Last-Modified字段,则在发起请求时,在请求体的If-Modified-Since字段中存入Last-Modified的值。 服务端也会验证资源是否最新可用,并做相关处理。
      • 若不存在Lat-Modified字段,则直接向服务端发起请求,进行缓存协商。(此时相当于第一次请求该资源)

1.3 url解析过程(拓展)

  1. 用户在浏览器地址栏输入信息,browser进程解析输入信息,分析用户意图。
  2. 浏览器根据分析结果进行处理,让浏览器内核发起请求的部分去向服务器发起网络请求。
  3. 服务器处理相应请求后将响应结果返回,浏览器内核中读取响应的部分获取响应结果并将响应内容渲染出来,至此页面加载完成。

os:HTTP协议的字段内容远多于上述的字段,在开发学习的过程中还是需要多看请求的报文,用实际的请求情况去理解理论知识才能将知识记忆得更加牢固。HTTP协议的功能正变得更加丰富,目前看来http协议已经满足了数据传输的需求,而之后的计划就是将数据传输得更高效更安全稳定,提高用户体验。