HTTP1.0
- 只支持短连接 ,基于TCP 协议,使用的是TCP的短连接 (短连接 100张图则需要100次握手和100 次挥手),这样传输性能是很差的
- 无host头域 , 在浏览器请求(如下图)中只有一个IP,这样不利于网站的发展,因为目前往往一个域名会被解析成多个IP, 而且一台主机可以搭建多个网站(虚拟主机) 只有一个IP则无法区别这些虚拟主机(多台主机共享一个IP)
- 不允许断点续传 , 需要传输整个对象,不能只传输对象的一部分
1.1
- 引入了更多的缓存策略
- 在请求头部引入range头(为了允许断点续传功能)
- 加入host头域(允许使用虚拟主机)
- 长链接的支持(长连接 100张图 1次握手即可),支持了长链接和请求的流水线处理, 在TCP连接上可以传送多个HTTP请求(串行) 和响应, 减少了建立和关闭连接的消耗和延迟 , 在HTTP1.1中默认开启keep-alive , 这样缓解了每次连接时都要创建连接的性能消耗
串行带来的一个问题,一个包处理出现故障,则后续的数据包不能处理
2.0
-
长连接 + IO多路复用模型
-
新的二进制格式 HTTP1.x 的解析是基于文本. 基于文本格式存在一种缺陷, 文本的表现格式有多样性 , 要做到健壮性 , 考虑的场景有很多 二进制则不同, 只有0和1 的组合,实现了方便且健壮的特点
多路复用 (连接共享,是基于长链接的) 一个连接上有多个request -
HTTP2.0多路复用和HTTP1.1 中的长链接有什么区别
-
HTTP1.1 中多个请求 串行被处理, 后面的请求需要等待前面的请求处理完成才能被处理, 一旦有某个请求超时 ,则后续的只能被阻塞 (即对头阻塞)
-
HTTP2.0 多个请求可以同时在一个连接上并行执行. 若某个数据包请求超时,不影响其他连接的正常执行,但依然不能解决同一TCP层 下,前一个超时,后面数据包阻塞的问题(TCP层的对头阻塞)
-
header压缩 HTTP1.x中 header中信息数量较多,而且每次都要重复发送, HTTP2.0 使用encoder 来减少需要传输的header 大小 , 通讯双方各自cache一份 header fielder 表 , 既避免了header的重复传输 又减小了需要传输的大小 .
-
服务端推送(server push) 同SPDY (Google 开发的基于TCP会话层协议,对HTTP协议的增强) 一样 , HTTP2.0 也具有server push功能
-
3.0
- 基于Google的QUIC 协议
- 解决了HTTP2.0中TCP层的对头阻塞
- 优化了重传策略 , 重传包和原包的编码不同 , 降低后续重传策略的消耗
- 连接迁移 不再用TCP四元组确定一个连接 而是用一个64 位的随机数确定连接
- 提供更加合适的流量控制