lovelmh13/myBlog

HTTP 协议

Opened this issue · 0 comments

HTTP 协议

HTTP 协议是用来传输超媒体文档的应用层协议。他是无状态的。

HTTP/1.1

  1. 加入了持久链接,解决了 HTTP/1 的每次请求都重新建立一个 TCP 连接的问题。持久连接使得一个 TCP 连接上可以传输多个 HTTP 请求。

因为 TCP 连接每次也是很耗时的,且 TCP 存在慢启动的问题,每次重新连接都速度都会慢一些,如果遇到了网络用塞,还会再次降速再慢慢提速。

  1. 浏览器对同一个域名的请求有连接数的限制,默认每一次最多同时存在 6个 TCP 连接,加上使用持久链接,这会比 HTTP/1 提升不少,但是依然存在队头堵塞的问题。因为它必须按顺序传输,同时只能处理一个请求,请求完成一个才能再进行下一个。

  2. 加入了 HOST ,使得不同的域名可以用同一个 IP。

  3. 支持动态内容。不再提前在响应头中设置数据大小,而是在数据包上加上数据包的长度,通过最后的一块的发送完成标志,拼成一个完整的数据。

  4. 增加了 Cookie 和安全机制

HTTP/2

HTTP/2 主要提升了网络速度。

HTTP/1.1 中依然存在一些问题。对带宽(带宽是指每秒最大能发送或者接收的字节数)的利用率不高。主要是三个原因导致的:

  1. TCP 的慢启动。
  2. 多条 TCP,存在竞争带宽问题。
  3. 对头阻塞问题。

1 和 2都是因为 TCP 本身的问题,HTTP/2 也想办法处理这些问题。

与 HTTP/1.1 的同域名的连接数量为 6 不同,HTTP/2 直接改为了同一个域名采用一个长链接进行传输。

多路复用

HTTP/2 又增加了二进制分帧层。HTTP/2 是基于帧的协议。

服务端可以决定优先返回哪些内容。比如服务器之前就缓存了 index.html 和 bar.js 的响应头信息,那么收到请求以后直接就把这两个的响应头信息返回给浏览器,然后再把他们的响应体发给浏览器。之所以可以乱序的发送数据,是因为每个请求都带有ID,最后通过相同的 ID 将数据再拼接回来。

多路复用是通过二进制分帧层在实现的。

  • 当发送请求的时候,二进制分帧层会把数据拆成一个一个有 ID 的帧,然后发给服务器。

  • 服务器接收到所有帧以后,会把相同 ID 的的帧合并完整。

  • 服务器返回响应时,同样通过二进制分帧层,把响应数据转换成一个一个有 ID 的帧发给浏览器

  • 浏览器收到帧以后,在拼数据。

img

可以设置请求的优先级

增加服务器推送

对请求头和响应头进行压缩

HTTP/2 依然存在对头阻塞问题,为什么?

HTTP/3

HTTP/2 因为使用的还是 TCP 协议,所以依然存在对头阻塞问题。

因为 TCP 是单连接的,如果中间出现了丢包,整个 TCP 就会暂停,等待丢的包重新传过来。HTTP/2 使用了一个长链接来处理请求,所以如果其中一个丢包,所有的请求都会暂停,比起 HTTP/1.1 的同时6个,堵住 1 个,只剩 5 个更可怕。当丢包率到了 2%,HTTP/1.1 反而好于 HTTP/2。

想要解决这个问题,只有把 TCP 换掉了。于是由于种种原因,选择用 UDP 来取代 TCP。所以基于 UDP,形成了QUIC ,来实现 HTTP/3.

QUIC

QUIC 增加了流量控制、可靠传输的功能,又集合了 TLS 的加密功能。还实现了 HTTP/2 的多路复用功能,并且实现了快速握手。

img

不过由于存在设备僵化问题,HTTP/3 还不会这么快就大规模的使用。

参考

极客时间《浏览器工作原理与实践》