We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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 协议是用来传输超媒体文档的应用层协议。他是无状态的。
因为 TCP 连接每次也是很耗时的,且 TCP 存在慢启动的问题,每次重新连接都速度都会慢一些,如果遇到了网络用塞,还会再次降速再慢慢提速。
浏览器对同一个域名的请求有连接数的限制,默认每一次最多同时存在 6个 TCP 连接,加上使用持久链接,这会比 HTTP/1 提升不少,但是依然存在队头堵塞的问题。因为它必须按顺序传输,同时只能处理一个请求,请求完成一个才能再进行下一个。
加入了 HOST ,使得不同的域名可以用同一个 IP。
支持动态内容。不再提前在响应头中设置数据大小,而是在数据包上加上数据包的长度,通过最后的一块的发送完成标志,拼成一个完整的数据。
增加了 Cookie 和安全机制
HTTP/2 主要提升了网络速度。
HTTP/1.1 中依然存在一些问题。对带宽(带宽是指每秒最大能发送或者接收的字节数)的利用率不高。主要是三个原因导致的:
1 和 2都是因为 TCP 本身的问题,HTTP/2 也想办法处理这些问题。
与 HTTP/1.1 的同域名的连接数量为 6 不同,HTTP/2 直接改为了同一个域名采用一个长链接进行传输。
HTTP/2 又增加了二进制分帧层。HTTP/2 是基于帧的协议。
服务端可以决定优先返回哪些内容。比如服务器之前就缓存了 index.html 和 bar.js 的响应头信息,那么收到请求以后直接就把这两个的响应头信息返回给浏览器,然后再把他们的响应体发给浏览器。之所以可以乱序的发送数据,是因为每个请求都带有ID,最后通过相同的 ID 将数据再拼接回来。
多路复用是通过二进制分帧层在实现的。
当发送请求的时候,二进制分帧层会把数据拆成一个一个有 ID 的帧,然后发给服务器。
服务器接收到所有帧以后,会把相同 ID 的的帧合并完整。
服务器返回响应时,同样通过二进制分帧层,把响应数据转换成一个一个有 ID 的帧发给浏览器
浏览器收到帧以后,在拼数据。
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 增加了流量控制、可靠传输的功能,又集合了 TLS 的加密功能。还实现了 HTTP/2 的多路复用功能,并且实现了快速握手。
不过由于存在设备僵化问题,HTTP/3 还不会这么快就大规模的使用。
极客时间《浏览器工作原理与实践》
The text was updated successfully, but these errors were encountered:
No branches or pull requests
HTTP 协议
HTTP 协议是用来传输超媒体文档的应用层协议。他是无状态的。
HTTP/1.1
因为 TCP 连接每次也是很耗时的,且 TCP 存在慢启动的问题,每次重新连接都速度都会慢一些,如果遇到了网络用塞,还会再次降速再慢慢提速。浏览器对同一个域名的请求有连接数的限制,默认每一次最多同时存在 6个 TCP 连接,加上使用持久链接,这会比 HTTP/1 提升不少,但是依然存在队头堵塞的问题。因为它必须按顺序传输,同时只能处理一个请求,请求完成一个才能再进行下一个。
加入了 HOST ,使得不同的域名可以用同一个 IP。
支持动态内容。不再提前在响应头中设置数据大小,而是在数据包上加上数据包的长度,通过最后的一块的发送完成标志,拼成一个完整的数据。
增加了 Cookie 和安全机制
HTTP/2
HTTP/2 主要提升了网络速度。
HTTP/1.1 中依然存在一些问题。对带宽(带宽是指每秒最大能发送或者接收的字节数)的利用率不高。主要是三个原因导致的:
1 和 2都是因为 TCP 本身的问题,HTTP/2 也想办法处理这些问题。
与 HTTP/1.1 的同域名的连接数量为 6 不同,HTTP/2 直接改为了同一个域名采用一个长链接进行传输。
多路复用
HTTP/2 又增加了二进制分帧层。HTTP/2 是基于帧的协议。
服务端可以决定优先返回哪些内容。比如服务器之前就缓存了 index.html 和 bar.js 的响应头信息,那么收到请求以后直接就把这两个的响应头信息返回给浏览器,然后再把他们的响应体发给浏览器。之所以可以乱序的发送数据,是因为每个请求都带有ID,最后通过相同的 ID 将数据再拼接回来。
多路复用是通过二进制分帧层在实现的。
当发送请求的时候,二进制分帧层会把数据拆成一个一个有 ID 的帧,然后发给服务器。
服务器接收到所有帧以后,会把相同 ID 的的帧合并完整。
服务器返回响应时,同样通过二进制分帧层,把响应数据转换成一个一个有 ID 的帧发给浏览器
浏览器收到帧以后,在拼数据。
可以设置请求的优先级
增加服务器推送
对请求头和响应头进行压缩
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 的多路复用功能,并且实现了快速握手。
不过由于存在设备僵化问题,HTTP/3 还不会这么快就大规模的使用。
参考
极客时间《浏览器工作原理与实践》
The text was updated successfully, but these errors were encountered: