HTTP 0.9只支持get方法和html文本
HTTP 1.0增加Content-Type和Content-length字段
HTTP 1.1新增了Connection字段用来维持TCP长连接,在HTTP1.0中这是个非标准字段
引入了流水线传输,客户端可以同时发送多个请求(这玩意默认关闭,主要是实现起来复杂而且一些代理服务器不能正确处理,还有队头阻塞问题,就算能同时发起多个,性能差距也不会大,HTTP1.1的性能优化主要是维持多个TCP长连接)
引入了分块传输的机制,这个机制主要是用来代替Content-length字段(不能再使用)的,使用流模式代替缓存模式,产生一块数据就发送一块,而不是等待整个HTTP请求的数据都完成后才回应,Transfer-Encoding:Chunked说明使用了分块传输,每个非空块之前都有一个16进制数值代表块的长度,如果是0就代表数据发完了,相当于一个请求结束(对耗时动态操作好,用户体验好)
新增方法和字段:PUT,HEAD,OPTIONS,HEAD,host字段
缺点:基于请求-应答模式,在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。按照标准,服务器应该按照收到请求的顺序返回结果
如何改进队头阻塞问题?合并请求(JS和CSS),减少请求数,还有现在的很多浏览器都会多开几个长连接[大于六个服务器可能会触发DDOS]或者域名分片[www1.example.com
、www2.example.com
、www3.example.com
],keepalive
HTTP2
多路传输,一个连接里可以同时发送多个请求或者回应(没有严格的回应顺序),不用等待上一个回应发完才能发送下一个回应,解决了HTTP1.1应用层队头阻塞的问题
然后还引入了数据流,因为HTTP2它不是按顺序发送的,连续的数据包可能来自不同的请求,所以要对数据包做一个数据流的编号,来标识它来自于哪一个回应。
对头部进行了gzip或者compress压缩,并且在客户端和服务端维护了一张字段和索引号的头部信息表,这样每次发送头部字段就只用发送索引号就行了
允许服务器主动向客户端推送数据,这个一般不建议推送太多数据反而会拉低性能,一般是对第一次访问的用户发送,否则用户那边有缓存了还推送反而会浪费带宽