blog icon indicating copy to clipboard operation
blog copied to clipboard

《http2 in Action》阅读笔记

Open rudyxu1102 opened this issue 4 years ago • 0 comments

前言

这本书讲的很详细,先简单总结一下在书中学到的知识,后续需要深入了解实践再详细总结。

HTTP/1.x的缺陷

  • 效率低。需要等待上一个请求响应完成,才能发送下一个请求。可以进行域名分片,通过创建多个TCP连接改善。
  • 文本传输协议无法高效编码数据,而且容易导致安全问题

SPDY协议

SPDY(发音为speedy)协议是HTTP2发生重要改变的原因,引入了一些关键概念来解决HTTP/1.1的问题:

  • 实现无需先入先出的多路复用
  • HTTP首部压缩
  • 请求优先级

http请求是如何升级到http2协议

  • 使用upgrade首部,如果可以升级,则返回状态码101
  • 使用HTTPS协商。复用HTTPS建立连接的步骤,不会添加额外的消息往返。

浏览器缓存

浏览器会依次检查下面的缓存,最后没有缓存的话就向服务器发出请求。

  • 图片缓存(Image Cache)。短期内存中的缓存,可以防止多次下载同一引用的图片。
  • 预加载缓存(Preload Cache)。短期内存中的缓存,缓存预加载的资源。
  • Service Worker缓存(Service Worker Cache)。独立于网页运行的后台程序,可以让网站表现的更像原生应用。
  • Http缓存(HTTP Cache)。基于磁盘的永久缓存
    • 强缓存
    • 协商缓存
  • HTTP2推送缓存(HTTP/2 Push Cache)。短期内存中的缓存,跟TCP连接绑定。如果设置了缓存首部,则在后来使用推送缓存的时候依旧会保存在HTTP缓存中

服务端推送 vs 预加载

服务端推送允许服务端返回客户端未请求的资源,使用多个返回来响应一个请求。

预加载会让浏览器以最高优先级加载资源,可以设置link标签的ref属性为preload去实现预加载。

预加载没有服务端推送那么快,但是有以下的优势:

  • 预加载是浏览器发起的请求,而浏览器知道缓存里有什么,可以判断是否需要发出对应的请求。而服务端推送无法得知浏览器的缓存情况,会直接将资源发送给浏览器,从而浪费带宽。
  • 预加载可以从多个域名加载资源,而服务端推送只能推送自己域名下面的资源。

目前,服务端推送的实践还比较少,而预加载的优势明显且风险较低。

首部压缩

使用HPACK算法对请求首部进行压缩,HPACK算法基于查表法和Huffman编码,其原理如下:

  • 客户端和服务端维护一份共同的静态表,其中包含常见的首部名、常见首部名与首部值的组合。如果在表中常见首部名存在,但是不存在首部名与首部值的组合,使用Huffman对首部值进行编码。
  • 客户端和服务端维护一份可动态添加内容的动态表。

HTTP/2缺陷

  • 破坏了分层的概念。在HTTP层实现了TCP的相关概念,脱离了传统层级的划分,HTTP/2不再像HTTP/1一样对应应用层,还管理传输层的许多任务,比如多路复用和流量控制。HTTP/2引入的二进制分帧层横跨了应用层、表示层、会话层、传输层。
  • HTTP/2解决了HTTP层的队头阻塞,但是没有解决TCP层的队头阻塞。在某些丢包的情况下,HTTP/2可能比HTTP/1慢。
  • HTTP/2不再是无状态的。HTTP/2添加了一些状态的概念(例如流状态、HPACK动态表状态),添加状态只用于处理多路复用和首部压缩,不会用于其他的目的

QUIC协议

QUIC(发音quick)又是Google发明的一个基于UDP的协议,旨在解决HTTP/2存在的问题。

QUIC协议有哪些特性:

  • 前向纠错。根据成功传输的数据包计算出丢失的某个数据包,用来减少数据包重传的次数。
  • 连接迁移。支持连接在网络之间的迁移,比如从wifi切换到移动网络,不需要重新创建连接。
  • 改善拥塞控制
  • 改善多路复用

QUIC协议为什么基于UDP协议?

  • UDP协议没有拥塞控制、数据重传、数据排序等功能
  • 相比TCP而言,UDP协议是一个更轻量的协议
  • 在大多数情况下改进TCP需要升级操作系统,被广泛部署需要更多的时间

rudyxu1102 avatar Nov 15 '20 13:11 rudyxu1102