HTTP 1.0
短连接: 每次请求都要重新建立tcp请求,即三次握手,性能较差
无host头域: 也就是http请求头里的host’
不允许断点传输: ,而且不能只传输对象的一部分,需要传输整个对象
HTTP 1.1
引入更多缓存策略:在HTTP1.0中主要使用header里的If-Modefied-Since,expires来做为缓存判断的标准,HTTP1.1则引入更多的缓存控制策略例如Entity tag,if-ynmodified-Since,if-match等更多可供选择的缓存头控制策略
在请求头引入range头域: 它允许只请求资源的某个部分,即返回码是206,这样就方便开发者自由选择以便于充分利用带宽和连接
Host头处理: 在HTTP 1.0中认为每台服务器都绑定唯一一个IP地址,因此,请求消息中的URL并没有传递主机名,但随着虚拟主机技术的发展,在一台服务器上可以存在多个虚拟主机,并且他们共享一个IP地址
长连接支持: HTTP 1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求,减少建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection:keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
HTTP 2.0
新的二进制格式: HTTP1.X的解析是基于文本,基于文本协议的格式解析存在天然的缺陷,文本的表现形式有多样性,要做到健壮性考虑的考虑必然很多,二进制则不同,只认0,1的组合,基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮
多路复用: 即连接共享,一个连接上可以有多个request,一个request对应一个id,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面
HTTP 2.0的多路复用和HTTP 1.1中的长连接复用有什么区别?
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某个请求超时等,后续请求只能被阻塞,这就是常说的线头阻塞
HTTP/2多个请求可同时在一个连接上并行执行,某个请求任务耗时严重,不会影响其它连接的正常执行
header压缩: HTTP1.X的header中带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields,避免重复的header的传输,又减少了需要传输的大小
服务端推送: HTTP2.0也具有server push功能
HTTP 3.0
基于google的QUIC协议,而quic协议是使用udp实现的减少了tcp三次握手以及tls握手时间
解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题(TCP层的对头阻塞)
优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
连接迁移,不在用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接
更合适的流量控制