Skip to content

Commit

Permalink
feat: 旧档整理 http2
Browse files Browse the repository at this point in the history
  • Loading branch information
chunbin1 committed Jul 19, 2024
1 parent 0bd6631 commit 6f3e4b5
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions source/_posts/HTTP2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
title: HTTP2
date: 2024-07-19 11:34:21
tags: 网络
code_block_shrink: false
excerpt: HTTP2原理
---
## http1.1存在的问题
### 进步
1. 增加了持久链接
2. 浏览器为每个域名最多同步维护6个TCP持久链接
3. 使用CDN实现域名分片机制 // todo: 不知道是什么 需要看看

### 缺点
- 对带宽的利用率并不理想
原因:
1. TCP慢启动,推迟了宝贵的首次渲染页面的时长。

- 同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽
- HTTP/1.1 队头阻塞的问题
原因:
1. 在 HTTP/1.1 中使用持久连接时,虽然能公用一个 TCP 管道,但是在`一个管道中同一时刻只能处理一个请求`,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。这意味着我们`不能随意在一个管道中发送请求和接收内容`

## http2的解决方案
1. `一个域名使用一个TCP长连接来传输数据`,整个页面的资源下载过程只需要一次慢启动,同时避免来多个TCP长连接竞争带宽所带来的问题。
2. 多路复用,每个请求有一个对应的ID,浏览器接收到之后,会筛选出相同 ID 的内容,将其拼接为完整的 HTTP 响应数据
{% asset_img http2多路复用.png http2多路复用 %}


## http2的多路复用
{% asset_img http2协议栈.png http2协议栈 %}


http2添加了一个`二进制分帧层`

### 过程
1. 浏览器准备好请求数据,包括`请求行,请求头`,POST请求,还有`请求体`
2. 经过二进制分帧层,被转换为一个个带有`请求ID编号的帧`,通过协议栈将其发给服务器
3. 然后服务器处理该请求,并将处理的响应行、响应头和响应体分别发送至二进制分帧层
4. 二进制分帧层会将这些响应数据转换为一个个带有请求 ID 编号的帧,经过协议栈发送给浏览器
5. 浏览器接收到响应帧之后,会根据 ID 编号将帧的数据提交给对应的请求

## http2的其他特性
1. 可以设置请求的优先级,浏览器可以查看Priority优先级
2. 服务器推送,接收到HTML请求后,`附带将要使用的CSS文件和JS文件一并发送给浏览器`[具体配置实现](https://www.ruanyifeng.com/blog/2018/03/http2_server_push.html)
3. 头部压缩,打开network后可以看到很多`:authority`之类的请求头
Binary file added source/_posts/HTTP2/http2协议栈.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added source/_posts/HTTP2/http2多路复用.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 6f3e4b5

Please sign in to comment.