XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • 有了MAC地址 为什么还需要IP地址
  • 为什么IP地址老是变
  • 我们为什么需要IPV6
  • TCP与IP协议
  • TCP与UDP
  • https与http
  • DNS域名解析
  • 进程与线程
  • SSH
  • 正向代理与反向代理
  • 程序猿必须掌握的英语单词
  • ASCII、Unicode、UTF-8和UTF-16
  • 异或门怎么连
  • 前端够用的linux命令
  • http1.1与http2
    • 与服务器保持连接的几种方式
    • base64编码
    • 关于URL
    • http请求方式
    • 图解http阅读笔记
    • 计算机
    XingYun
    2022-02-01
    目录

    http1.1与http2

    现在是2022年,不少网站都选择了采用http2技术

    # 一、怎么看网站是不是http2

    打开网站,按F12打开调试模式,选择Network,在表头的竖线间隙处单击鼠标右键,勾选上Protocol,默认没有勾选

    h2代表是http2协议

    某些网站可能会选择两种模式混用,知乎就是文本文件走http2,接口走的http1.1

    # 二、http1.1有啥问题

    现在我们先看一下 HTTP 发展到 1.1 存在有哪些问题:

    1. 线头阻塞:TCP 连接上只能发送一个请求,前面的请求未完成前,后续的请求都在排队等待。

    2. 多个 TCP 连接:1.1 版本请求并发依赖于多个 TCP 连接,建立 TCP 连接成本很高,还会存在慢启动的问题。

    3. 头部冗余,采用文本格式:HTTP/1.X 版本是采用文本格式,首部未压缩,而且每一个请求都会带上 cookie、user-agent 等完全相同的首部。

    我们看看 http2 是怎么解决上面三个问题的

    # 三、多路复用解决阻塞和并发问题

    先看一个网络请求的瀑布图

    打开控制台可以看到,HTTP/1.1 的方式,后面的图片的加载时间主要耗时在 stalled,stalled 的意思是从 TCP 连接建立完成,到真正可以传输数据之间的时间差。这就是队头阻塞,前面的请求没有处理,后面的请求都在排队等待。

    HTTP2 的多路复用完美解决了线头阻塞问题。HTTP2 让所有的通信都在一个 TCP 连接上完成,真正实现了请求的并发。我们来看一下 HTTP2 具体是怎么实现的:

    HTTP2 建立一个 TCP 连接,一个连接上面可以有任意多个流(stream),消息分割成一个或多个帧在流里面传输。帧传输过去以后,再进行重组,形成一个完整的请求或响应。这使得所有的请求或响应都无法阻塞。

    这是采用了http2的apple官网 (opens new window)

    我们可以看到stalled的等待时间非常短,几乎可以忽略不计

    # 四、头部压缩解决头部冗余问题

    在1.X版本中,首部用文本格式传输,通常会给每个传输增加500-800字节的开销。现在打开一个网页上百个请求已是常态,而每个请求带的一些首部字段都是相同的,例如cookie、user-agent等。

    HTTP2为此采用HPACK压缩格式来压缩首部。头部压缩需要在浏览器和服务器端相互配合,维护一套header字典 (opens new window)

    字典部分内容

    我们在传输首部字段的时候,例如要传输method:GET,那我们只需要传输静态字典里面method:GET对应的索引值就可以了,一个字节搞定。像user-agent、cookie这种静态字典里面只有首部名称而没有值的首部,第一次传输需要user-agent在静态字典中的索引以及他的值,值会采用静态Huffman编码来减小体积。

    example:

    第一次传输过user-agent 之后呢,浏览器和服务器端就会把它添加到自己的动态字典中。后续传输就可以传输索引了,一个字节搞定。

    # 五、怎么启用http2

    前置条件

    1. nginx版本不低于1.9.5版本
    2. openSSL版本不低于1.0.2版本
    3. 已配置 HTTPS
    server {
    	# 添加 http2
    	listen 443 ssl http2;
    	...
    }
    
    
    1
    2
    3
    4
    5
    6

    重启nginx

    之后可以通过前面的方法验证是否开启

    #网络
    上次更新: 2023/04/05, 09:41:10
    前端够用的linux命令
    与服务器保持连接的几种方式

    ← 前端够用的linux命令 与服务器保持连接的几种方式→

    最近更新
    01
    JavaScript-test
    07-20
    02
    二维码的原理
    07-20
    03
    利用ChatGPT优化代码
    07-20
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式