HTTP/2推送旨在推送与主要资源相关的资源。
它主要用于浏览器。在请求index.html
页面时,浏览器会被推送index.html
引用的style.css
和application.js
文件。
从技术上讲,可以在单个响应中向客户端流式传输视频(批量下载)。
对于更高级的功能,例如稍微缓冲一下并只在视频流播放时下载,HTTP客户端可以进行范围请求。
对于下载具有不同分辨率的平行流——720p与1080p——客户端可以发出两个不同的请求。
需要配置HTTP/2以使客户端具有大的流控窗口(请参见此答案),但对于浏览器来说,已经是这样的情况了,而大多数HTTP/2客户端库也支持这种类型的配置。
因此,从技术上讲是可能的,但它与WebSocket相比如何呢?
WebSocket完全缺乏元数据概念,因此应用程序编写者必须发明一些元数据格式用于请求和响应,例如视频流ID /标题,分辨率,范围等,然后下载原始视频。
HTTP/2帧开销为9字节,WebSocket帧开销为10字节(假设有大型帧)。 但是,HTTP/2的最大帧大小为16 KiB,而WebSocket的最大帧大小可能更大,尽管可能不推荐太大(因为客户端可能决定不为服务器发送的超大帧分配资源)。
此外,在WebSocket中,存在最大消息大小概念。通常不能仅发送属于同一消息的WebSocket帧,因此需要将视频拆分为多个更小的消息(但这只是技术细节)。
最后,HTTP/2可以在HTTP/2流中进行WebSocket通信(RFC8441)。
这意味着HTTP/2请求/响应可以完美地模拟WebSocket通信:您将拥有一个“无限”请求 - 其具有永远不会结束的请求内容(直到通信关闭) - 用于从客户端到服务器的通信,并拥有一个“无限”响应 - 其具有永远不会结束的响应内容(直到通信关闭)-用于从服务器到客户端的通信。
总之,我不会使用HTTP/2 推送来流式传输视频:普通的HTTP/2响应可以更有效地完成此任务(就像WebSocket一样)。
我认为WebSocket非常有用,可用于服务器向客户端进行未经请求的通信。使用HTTP/2,客户端必须始终发起请求。