HTTP各版本简介

简介

HTTP(Hyper Text Transfer Protocol)即超文本传输协议,是一种用于客户端与服务端进行信息交换的通信协议;
特点:

  1. 简单
  2. 无状态:http本身是无状态协议,通过Http Cookie实现了有状态的会话;
  3. 连接:一般基于TCP连接,请求的默认端口号是80(HTTPS默认端口号443);

版本及特点

  1. HTTP/0.9 —— 单行协议
    特点:

    1. 请求不包含版本号信息,仅支持get请求;
    2. 协议由单行指令构成: GET /index.html
    3. 响应无Header及状态码,仅包括HTML文档本身;

  2. HTTP/1.0 —— 构建可扩展性
    特点:

    1. 协议版本随GET行发送;
    2. 引入HTTP头,请求或相应为多行指令构成;包括:Allow/ Authorization/content-type/content-coding/content-length/Date/Expires/From/If-modified-Since/Last-Modified/Location/Pragma/Referer/Server/User-Agent/WWW-Authenticate等;
    3. 支持更多的请求方法:GET/HEAD/POST
    4. 支持更多的资源类型:html、图片、音视频等;
    5. 引入状态码:

    缺点:

    1. HTTP请求基于TCP连接,HTTP/1.0协议中每次请求均需要建立TCP连接,不可服用;
    2. 安全性:是一种无状态协议,身份认真需要通过HTTP Cookie,明文传输数据,因此具有被攻击的危险;
    3. 协议开销大:头部信息过大后,每次请求都会携带这些信息;不仅造成带宽浪费,也会增加服务延时;

  3. HTTP/1.1 —— 标准化的协议
    特点:

    1. 长连接:HTTP/1.1默认采用长连接,即同域名下建立一个TCP连接用于多次通信和数据传输;
    2. 管道化:持久化连接中,可以不用等一个请求被响应后再发送请求,可以连续发送多个请求;当然,服务端的响应顺序是与请求顺序保持一致的;
    3. 引入新的缓存机制:引入cache-control机制;
    4. 内容协商机制:客户端与服务端约定请求的方法、语言、编码类型等信息;使用Accept/Accept-Language/Accept-Encoding等;
    5. 分块传输编码:支持Chunked Transfer Coding,对响应数据进行分块传输,每个chunk包含其大小及数据(均为十六进制),size信息独占一行;可以用于动态处理内容的传输;使用头部Transfer-Encoding: chunked标识;最后一个chunk仅包含size信息,用于告知数据传输完成;
    6. 更加丰富的请求方法:OPTIONS/GET/HEAD/POST/PUT/DELETE/TRACE/CONNECT
    7. 新增状态码

  4. HTTP/2.0 —— quicker、better、safer
    特点:

    1. 头部压缩:使用HPACK算法,减少每次传输不必要的头部信息;它的实质就是一种diff算法;客户端和服务端同时维护一张保存头信息的表,并在每次通信后同步更新;首次请求会保存全部字段;之后只需要传输差别信息即可;

      HTTP各版本简介
      2. 二进制分帧:HTTP/2.0的每个请求或响应称为消息,每个消息分为一个或多个帧,采用效率更高的二进制而不是文本格式进行编码传输;
      3. 多路复用:同域名下建立一个TCP连接,该连接可以用于多个请求的处理;
      4. Server Push:即客户端请求一个页面后,服务端在未接受到后续请求时就返回响应请求,以及通过页面解析发现的客户端后续可能用到的资源,如图片、css、js等;
      HTTP各版本简介

参考文献

  1. https://juejin.im/post/5d5fe4cb51882569d64b9228
  2. https://blog.fundebug.com/2019/03/07/understand-http2-and-http3/
  3. HTTP的发展
  4. HTTP/1.0 RFC.
  5. HTTP/1.1 RFC
  6. https://blog.fundebug.com/2019/03/07/understand-http2-and-http3/