HTTP缓存策略、HTTP队头阻塞、HTTP2.0的概念你真的了解吗?( 二 )


有的! 在HTPP1.0开始增加了Connection: Keep-Alive字段,可以让TCP链接持续打开 。这样就可以节省了一个请求创建一次TCP通道的性能消耗 。
在HTTP1.1引入了持久连接 和 管道机制
持久连接持久连接:即不用声明Connection: keep-alive字段,TCP连接默认不关闭,并且可以被多个请求复用 。长连接的连接时长可以通过请求头中的 keep-alive 来设置 。
当客户端请求中含有Connection: Keep-Alive首部,服务器响应中也有Connection: Keep-Alive首部时,双方才会成功建立持久连接 。
在服务器返回【Connection: Keep-Alive】字段时,还可以追加【Keep-Alive: max=5, timeout=120】字段

HTTP缓存策略、HTTP队头阻塞、HTTP2.0的概念你真的了解吗?

文章插图
 
Connection: Keep-AliveKeep-Alive: max=5, timeout=120复制代码上面个例子说明,服务器最多还会为另外5个事务保持TCP连接的打开状态,或者将打开状态保持到连接空闲了2分钟之后 。
管道机制HTTP1.1 允许在持久连接上可选择使用请求管道 。这是相对于keep-alive连接的又一性能优化 。在相应到达之前,可以将多条请求放入队列,当第一条请求发往服务器的时候,第二第三条请求也可以开始发送了,在高延时网络条件下,这样做可以降低网络的环回时间,提高性能 。
持久连接 + 管道机制 引发 HTTP队头阻塞前面提到HTTP管道化要求服务端必须按照请求发送的顺序返回响应,那如果一个响应返回延迟了,那么其后续的响应都会被延迟,直到队头的响应送达 。
HTTP队头阻塞 的解决方法利用HTTP2的多路复用解决:对于HTTP1.1中管道化导致的请求/响应级别的队头阻塞,可以使用HTTP2的多路复用解决 。
HTTP2不使用管道化的方式,而是引入了帧、消息和数据流等概念,每个请求/响应被称为消息,每个消息都被拆分成若干个帧进行传输,每个帧都分配一个序号 。每个帧在传输是属于一个数据流,而一个连接上可以存在多个流,各个帧在流和连接上独立传输,到达之后再组装成消息,这样就避免了请求/响应阻塞 。
当然,即使使用HTTP2,如果HTTP2底层使用的是TCP协议,仍可能出现TCP队头阻塞 。
并发连接我们知道对于一个域名而言,是允许分配多个长连接的,那么可以理解成增加了任务队列,也就是说不会导致一个任务阻塞了该任务队列的其他任务,在RFC规范中规定客户端最多并发2个连接,不过实际情况就是要比这个还要多,举个例子,Chrome中是6个 。
域名分片顾名思义,我们可以在一个域名下分出多个二级域名出来,而它们最终指向的还是同一个服务器,这样子的话就可以并发处理的任务队列更多,也更好的解决了队头阻塞的问题 。举个例子,比如TianTian.com,可以分出很多二级域名,比如Day1.TianTian.com,Day2.TianTian.com, Day3.TianTian.com, 这样子就可以有效解决队头阻塞问题 。
HTTP2
  • 二进制分帧 这是一次彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧 。
  • 头部压缩 HTTP 1.1版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重 。HTTP 2.0 使用 HPACK 算法进行压缩 。
  • 多路复用 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题 。
  • 服务器推送 允许服务器未经请求,主动向客户端发送资源,即服务器推送 。
  • 请求优先级 可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验 。

【HTTP缓存策略、HTTP队头阻塞、HTTP2.0的概念你真的了解吗?】


推荐阅读