Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP 协议 #69

Open
lovelmh13 opened this issue Jun 10, 2021 · 0 comments
Open

HTTP 协议 #69

lovelmh13 opened this issue Jun 10, 2021 · 0 comments

Comments

@lovelmh13
Copy link
Owner

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 还不会这么快就大规模的使用。

参考

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

@lovelmh13 lovelmh13 mentioned this issue Jun 21, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant