一、HTTP/1.x
-
基于
TCP连接 -
只能传送文本内容
-
同一连接(
Keep-Alive的情况)同时只能处理一个请求,请求的响应回来后才能开始发送下一个请求-
非
Keep-Alive的每个请求都会新建一个TCP连接 -
如果支持客户端和服务器(以及中间结点)都支持
HTTP流水线(HTTP Pipelining),客户端可以同时发出多个请求,但服务端在传送完请求1的响应后才能开始传送请求2的响应
-
为提高传输效率,浏览器等应用层软件会选择与同一服务器同时建立多个
TCP连接(一般上限是6个):
- 连接限制的对象是域名而非
IP,可用域名分片(同一IP绑定多个域名)来绕过连接数限制Apple平台的NSURLSession可配置HTTPMaximumConnectionsPerHost来指定上限(iOS默认为4,mac默认为6)
二、HTTP/2
- 基于
TCP连接 - 传送二进制数据(包括
HEADER和DATA) - 同一个连接可以用来同时发送多个请求和响应
- 可指定各个请求之间的依赖关系和各自的权重
- 依赖关系用来顺序化,依赖方会等被依赖方响应回来之后再开始请求
- 权重用来告诉系统分配多少资源给该请求
- 不再需要建立多条
TCP连接
- 可指定各个请求之间的依赖关系和各自的权重
Header支持压缩(HPACK算法)- 因为是多路请求复用同一连接,协议支持分别按请求、按方向做流量控制
- 支持服务端主动推送客户端未请求的数据