1.Http1.0
1.1 http1.0问题
Http的特点“一来一回”,客户端发起一个TCP连接,在连接上发一个HTTP Request到服务器,服务器返回一个HTTP Response,然后关闭连接。
这样的协议存在两个问题:
(1)性能问题:耗时,连接数有限。
(2)服务器推送问题:不支持“一来多回”。
1.2 Keep-Alive机制与Content-Length属性
解决性能问题:Http1.0设计了一个Keep-Alive机制实现TCP连接的复用。就是在HTTP请求头部加上字段Connection Keep-Alive。服务器收到这样的请求后就不会关闭,同时HTTP的Response也加上该字段,等待该连接的下一个请求。再者,连接数量有限,所以服务器会有一个Keep-Alive timeout参数,若没有新的请求过来,就会关闭连接。
问:客户端如何知道连接处理结束了?
答:Http Responsed的头部返回一个Content-Length:xxx的字段,这个字段可以快告诉客户端Http Response的Body共有多少字节。
2.Http1.1
2.1 连接复用与Chunk机制
默认连接复用,除非Connection:Close属性,才会处理完关闭。
Http1.0中Content-Length计算动态代码比较耗时。所以Http1.1引用Chunk机制(Http Streaming),即,响应头部加上,Transfer-Encoding:chunked属性。
2.2 Pipeline与Head-of-line Blocking问题
连接复用还存在一个问题,同一个连接上是串行的,导致并发度不够。Http1.1引入了Pipeline机制,可以在上一个请求没有响应返回时发送下一个请求。
但是Pipeline有个问题,就是Head-of-Line Blocking(对头阻塞)。相对列一样,如果客户端收不到请求1的响应,则请求2,3会被阻塞。
2.3 Http/2出现之前的性能提升方法
一方面,Pineline不能用,请求是串行的。另一方面,同一个域名,浏览器限制只能开6~8个连接。
如何提高高并发度?
(1)Spriting技术
针对小图片,把小图片拼成一张大图发送一个请求,再通过JS.CSS截取小图片。
(2)内联(Inlining)
把图片嵌入到CSS文件里。
(3)JS拼接
把大量小的JS文件合并成一个文件并压缩。
(4)请求的分片技术
多做几个域名,绕开浏览器的显示连接量
2.4 “一来多回”问题
怎么样做到服务器主动推送,实现一来多回?
(1)客户端定期轮询
每5秒发送一个HTTP请求。效率低,增加服务器压