HTTP
协议
是浏览器和服务器之间的 通信语言
传递 HTML 超文本
的内容Content-Length
来确定数据的大小,但是随着服务端的发展,很多页面内容都是 动态生成 的,所以在传输之前不知道最终的数据大小,导致浏览器 无法确定 数据是否已全部接收解决 HTTP1.1 中 TCP 的慢启动、带宽资源竞争、队头拥塞问题,虽然 TCP 是造成这些问题的源头,但是目前依然无法脱离 TCP 协议,只能想办法规避上述问题。
如何解决队头堵塞?
浏览器每个发起的请求都会携带一个 ID
,当服务器返回数据时也会携带对应的 ID,浏览器会将返回的 ID 的内容拼接为完整的 HTTP 响应数据
可将请求分成一帧一帧的数据进行传输,当收到优先级高的请求时,服务器可以暂停之前的请求来 处理优先级较高 的资源请求
实现机制:
HTTP2 新增了 二进制分帧层
flowchart BT
subgraph HTTP2 协议栈
subgraph 请求列表
...
end
subgraph 二进制分帧层
subgraph 完整请求
请求头+ID
响应头+ID
响应体+ID
end
end
请求列表 <--> 二进制分帧层 <--> TLS[TLS 可选] <--> TCP/IP
end
如何解决 TCP 慢启动次数和 TCP 之间宽带资源竞争?