HTTP 0.9
特点:
- 只有get方法
- 不支持请求头,只能请求html
- 无法建立持久连接,服务端响应之后,立即关闭TCP连接
HTTP 1.0
特点:
- 增加了post、delete、put、header等方式
- 增加了请求头、响应头
- 扩充了传输内容的格式:图片、音频、二进制
- 性能差,每个TCP链接只能发送一个请求
- 无连接无状态,每次请求需要重新建立连接,tcp链接无法复用,且强制要求前一个请求到达之后,下一个请求才能发送。
丢包和乱序使得复用困难和队头堵塞产生许多问题。
HTTP 1.1
特点:
- 增加长链接,connection字段设置keep-alive,可达到tcp复用的效果。但是在c/s中的s端服务器响应较慢,则仍旧存在队头堵塞问题。
- 管道化,允许客户端同时发送多个请求,c客户端不存在队头堵塞问题。但服务器端仍然存在队头堵塞问题。
- 增加 PUT、PATCH、OPTIONS、DELETE
- 增加host字段,用来指定服务器的域名,这样可以将多种请求发往同一台服务器上的不同网站,提高机器的复用。
HTTP 2.0
特点:
- 二进制格式,1.x是文本协议,2.0以二进制帧为基本单位,所有传输消息分割为消息和帧。
- 多路复用,借助二进制帧的标识,实现多个请求公用一个连接,实现链路的复用
- Hpack,头部压缩算法,减少相同头部的传输,进行增量式更新。
- 服务端推送,允许服务器主动向客户端发送资源。
- 以提升性能为主要目标
详解:
2.0的设计目标是在兼容1.x语义和操作的基础上,给用户带来更快捷、更简单、更安全的体验高效地利用当前的网络带宽,为此2.0做了很多调整主要包括:
二进制化分帧、多路复用、头部压缩等。
2.1 二进制分帧层需要知道四个概念:
- 链接Link,一条C/S之间的TCP链接,这是个基础的链路数据的高速公路
- 数据流Stream,已建立的TCP连接内的双向字节流
- 消息Message,消息属于一个数据流,消息就是逻辑请求或响应消息对应的完整的一系列帧
- 帧Frame,帧是通信的最小单位,每个帧都包含帧头和消息体,标识出当前帧所属的数据流
2.2 多路复用
客户端和服务器将交互数据分解为相互独立的帧,互不影响地交错传输,最后再在对端根据帧头中的流标识符把它们重新组装起来,从而实现了TCP链接的多路复用。
2.3 首部压缩
一条链接而言大部分的包的header部分都是相同的,这样的话每次传输相同的部分确实非常浪费。
2.4 服务端推送
- 不同于以往的一问一答式的C/S交互方式,推送式服务器可以对一个请求发送多个响应。
## HTTP3.0
那么肯定要问HTTP2.0虽然性能已经不错了,还有什么不足吗? - 建立连接时间长(本质上是TCP的问题)
- 队头阻塞问题 - 移动互联网领域表现不佳(弱网环境)
从本质上来讲这些缺点基本上是由TCP协议引起的。