http协议各个版本(0.9~3.0)的差异,都解决了什么问题

97 阅读2分钟

1.HTTP/0.9

  • 超文本传输协议
    • 主要传输文本信息
  • 特点
    • 1.只有请求行
    • 2.服务器没有返回响应头信息
    • 3.ASIIC码形式传输

2.HTTP/1.0

  • 解决问题
    • 实现多类型文件的下载,音视频,css,js图片等等
  • 改进
    • 增加请求头字段
      content-charset content-type content-encoding coentent-language
      
    • 增加响应行

      响应行状态码 200 201 301 302 304 400

    • 实现请求缓存机制,强缓存字段 expire
    • 识别服务器信息,用户代理字段,proxy
  • 问题
    • 短连接,每个http请求都要建立一次tcp链接
    • 队头阻塞
    • 不支持虚拟主机,每个域名绑定了一个唯一的 IP 地址,因此一个服务器只能支持一个域名
    • 动态内容支撑,content-length长度是固定的
    • 安全方面不支持,cookie等安全

3.http/1.1

  • 改进
    • 长连接

      Connect:Keep-alive 默认是开启的;Connection: close来关闭

    • 加强了缓存处理

      增加了强缓存cache-control字段,协商缓存etag,If-Unmodified-Since, If-Match, If-None-Match等字段

    • 对头阻塞优化,管线化技术
    • 曾加了范围请求,Range字段
    • 增加了Host字段,虚拟主机
    • Chunk transfer 机制
    • 增加了错误 status code
  • 效率提升

    览器为每个域名最多同时维护 6 个 TCP 持久连接

    使用 CDN 的实现域名分片机制

  • 问题
    • 1.TCP 的慢启动
    • 2.多个并发的tcp链接的宽带竞争
    • 3.对头阻塞问题

4.http/2.0

  • 协议栈

    • HTTP
    • HPack /Stream
    • TLS 1.2+
    • TCP
    • IP
    • MAC
  • 特点

    • 头部压缩

      • HPack对头部字段进行压缩
      • 没有了起始行,改用伪字段,:status
      • 客户端与服务器都维护了一张静态表与动态表,发送与响应数据时只要发送或者响应key就行
    • 二进制帧形式传输

      • headers frame + data frame
    • 虚拟流

      • stream ID 客户端ID为奇数,服务器端为偶数
      • 双向传输序列,
      • 服务器能自己建流,向客户端推送消息
      • 并发多个流,多路复用,解决了队头阻塞问题
    • 一个域名只用一个TCP链接

  • 改进

    • 多路复用
    • 头部压缩
    • 设置请求的优先级
    • 服务器推送
  • 问题

    • TCP还是会有对头阻塞问题

5.http/3.0

QUIC 协议代替TCP协议,解决了TCP队头阻塞