http0.9
- 只有一个命令GET,没有header等描述数据的信息,服务器发送完成,就关闭tcp协议
http1.0
- 增加了请求命令(GET、POST、HEAD)
- status code
- header
- 多字符集的支持(图片,视频…)
- 权限
- 缓存
- 内容编码
- 多部分发送
缺点
HTTP/1.0版本的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
TCP连接的新建成本很高,因为需要客户端和服务定三次握手,并且开始时发送速率较慢。所以HTTP1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题愈发突出了。
为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。Connection: keep-alive
这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决方法。
http1.1
- 增加了请求命令(OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT)
- 持久连接
- 增加host
缺点
虽然1.1版本允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行一个回应。要是前面的会有特别慢,后面就会有许多请求排队等着。这称为队头阻塞
为了避免这个问题,只有两种方法:
- 减少请求数
- 同时多开持久连接
这导致了很多的网页性能优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。
spdy协议
谷歌自行研发,主要解决http1.1效率不高的问题,被当作http2的基础,主要特性都被http2继承
http2
- 二进制传输
- 信道复用
- 分帧传输
- server push