HTTP0.9
- 只支持 GET 方法,没有请求头
- 服务器只返回 HTML
HTTP1.0
- 引入了请求头和响应头,支持多种请求方法和状态码
HTTP1.1
- 对于 1.0 进行了补充
-
- 长连接
- 为了解决 HTTP1.0 每次请求都需要建立新的连接的问题
- 只要服务器和客户端没有一端提出断开链接, 就保持 TCP 连接状态
-
- 管道网络传输
- 在同一个 TCP 连接里,客户端可以同时发起多个请求,减少整体响应时间
- But!服务端只能一个一个处理请求并阻塞剩余请求,这个技术没有默认开启
- 存在的问题
- 头部冗余
- 服务器按顺序响应,会队头阻塞
- 没有请求优先级控制
- 请求只能从客户端开始,服务器只能被动响应
HTTP2.0
- 协议基于 HTTPS ,安全性有保障
- 改进之处
- 头部压缩,HPACK 压缩算法,利用静态表记录常用的头部,利用动态表记录重复的头部
- 二进制帧
- 并发传输:引出 Stream 概念。多个 Stream 复用一条 TCP 连接,针对不同的 HTTP 请求用 Stream ID 区分
- 服务器推送:服务器可以对客户端的一个请求发送多个响应
- 存在的问题
- 传输层(TCP/IP)依旧存在队头阻塞问题:TCP 字节流需要保证接收的字节连续且完整,由于 HTTP 层实现的流在 TCP 层感知不到,依旧体现为一个 TCP 数据段,所以如果 TCP 数据段丢失则会影响所有流
HTTP3.0
- 对于 2.0 的改进
- 因为 TCP 层的队头阻塞不可避免,所以干脆使用 UDP
- HTTP 2 如果首个请求丢包,就会阻塞到首次请求的数据包重传(建立动态表)
- QUIC 协议用两个专用的 Stream 用来同步动态表,如果没有成功同步就不会使用动态表编码 HTTP 头部
- 额外的不同点:
QUIC
协议
- 0 RTT 连接
- 无队头阻塞
- 连接迁移:在网络切换时,将连接迁移到新的 IP 地址,减少连接的中断时间
- 向前纠错机制:数据包会带其他数据包的数据,少量丢包可以通过其他包的冗余直接组装无需重传