十二HTTP 2.0

# HTTP 2.0

## 一、HTTP/2.0 的前世今生

​    超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。指定了客户端发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;HTTP最早只是为了浏览器获取web服务器端资源信息的,但当时的页面的内容、排版、交互等都相对简单,所以早期的HTTP/1.0 和 1.1 都没有考虑太多效率上的问题,但随着web 2.0 甚至 web 3.0 时代的到来,HTTP 效率的问题逐渐凸显,页面上内容更加丰富(视频、图片)、排版也更加精美多样(css样式)、复杂的用户交互也越来越多(js),所以当前我们请求网站首页时所需要加载的数据总量和请求数量都越来越多,效率不足已经是亟待解决的问题了。

#### HTTP协议

* 原理,它是一种用于传输超文本文件的协议,能够正确保留超文本标签及其对应的链接地址,让浏览器识别并加载这些标签的功能。

#### HTTP/2.0

​    HTTP/2.0 协议的出现主要归功于google的一个工具SPDY。
​    SPDY:HTTP在引入SPDY协议后,页面的加载效率平均提高了60+%。
特性:HTTP/2.0协议相较于HTTP/1.1在加载大量图片资源时,其响应效率更高,这主要是由于HTtP2.0对TCP协议进行了优化,从而提高了传输效率。H2协议相比H1协议具备许多优势,像支持多路复用、首部压缩等

## 二、HTTP/2.0 升级后的新特性

## 1. 全新的二进制格式(Binary Format)

http/1.x诞生的时候是明文协议,其格式由三部分组成:start line(request line或者status line),header,body。![[Pasted image 20240930163553.png]]


​    http/2.0 的格式定义更接近tcp层的方式,length定义了整个frame的开始到结束,type定义frame的类型,flags用bit位定义一些重要的参数,stream id用作流控制,剩下的payload就是request的正文了。看上去协议的格式和http/1.x完全不同了,实际上http/2.0并没有改变http/1.x的语义,只是把原来http/1.x的header和body部分用frame重新封装了一层而已。调试的时候浏览器甚至会把http/2.0的frame自动还原成http/1.x的格式。

![[Pasted image 20240930163642.png]]

#### 2. 多路复用 (Multiplexing)

​    在HTTP/1.1 协议中,浏览器作为客户端,在同一时间内针对同一域名下的请求有一定数量的限制,当超过数量限制时请求会被阻塞。==允许多个请求和响应同时在一个连接上进行,避免了HTTP/1.1中的队头阻塞问题。==

​    多路复用允许同时通过单一的 HTTP/2.0 连接发起多重的请求-响应消息。因此 HTTP/2.0 可以很轻松的实现**多流并行**而不用依赖建立多个 TCP 连接,HTTP/2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上**双向交换**消息。
![[Pasted image 20240930163754.png]]
#### 3. 首部压缩(Header Compression)

​    HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2.0 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 ==HTTP/2.0 则使用了专门为首部压缩而设计的 HPACK 算法。减少了数据传输量,提高了性能。==

![[Pasted image 20240930163820.png]]
#### 4. 服务端数据推送(Server Push)

​    在 HTTP/2.0 中,服务器可以对客户端的一个请求发送多个响应,如果你的请求是一个网站的首页,服务器很可能会响应主页内容、logo 以及样式文件等,因为服务器知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送还有一个很大的好处:可以缓存!不同页面之间可以共享缓存资源。==服务器可以在客户端请求之前预先推送资源,进一步减少加载时间。==

## 三、HTTP/2.0 对比 HTTP/1.1 效果展示

#### 对比效果图:
![[Pasted image 20240930163855.png]]

## 四、实验:web 服务器实现 HTTP/2.0

#### 1. 准备工作
==注意事项:在部署过程中,需要开启加密和Http2.0的是apache和Nginx服务器==
1. 操作系统选择CentOS 7.x,yum源自带的很多软件版本依赖就足够了
2. httpd 版本需要在2.4.17以上,否则不支持 mod_http2
3. Nginx 版本需要在1.10以上,否则不支持HTTP/2.0
   openssl版本需要在1.0.2以上,否则不支持HTTP/2.0
4. HTTP/2.0只支持开启了https的网站,即便如此还是要比用HTTP/1.1版本未加密的效率要高

基础源:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

扩展源:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

#### 1. 实验一加密并开启http2.0 Apache服务器

1. 下载合适版本的httpd软件 [Welcome! - The Apache HTTP Server Project](https://httpd.apache.org/)

2. 安装支持HTTP/2.0的库

```shell
yum -y install libnghttp2-devel
```

http/2 依赖 libnghttp2 的库,需要提前安装。

3. 解决依赖关系并安装httpd软件

```shell
tar -xf apr-1.7.5.tar.gz 
tar -xf apr-util-1.6.3.tar.gz
cp -r apr-1.7.5 httpd-2.4.62/srclib/apr
cp -r apr-util-1.6.3 httpd-2.4.62/srclib/apr-util
 yum -y install gcc gcc-c++ pcre-devel openssl openssl-devel expat-devel libnghttp2-devel
cd httpd-2.4.62/
./configure --prefix=/usr/local/apache2 --sysconfdir=/usr/local/apache2/etc --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-ssl --enable-http2
 make && make install

```

4. 修改配置文件,开启HTTP/2.0模块和SSL模块的调用

```shell
cd /usr/local/apache2/etc/
vim httpd.conf
LoadModule http2_module modules/mod_http2.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
```

5. 创建证书秘钥文件

```shell
 cd /usr/local/apache2/etc/
 openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt

```

5. 修改配置文件,开启虚拟主机,添加443端口的虚拟主机

```shell
vim httpd.conf
ServerName www.linuxlc.com:80
Protocols h2c http/1.1
#兼容不同的客户端,使其2和1.1都能响应。
Include etc/extra/httpd-ssl.conf
<Directory "/usr/local/apache2/htdocs">
    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1
</Directory>
 vim extra/httpd-ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/usr/local/apache2/htdocs"
#就添加支持h2协议即可
Protocols h2 http/1.1
ServerName www.linuxlc.com:443
ServerAdmin you@example.com
ErrorLog "/usr/local/apache2/logs/error_log"
TransferLog "/usr/local/apache2/logs/access_log"
SSLEngine on
#因为创建的证书和秘钥文件符合配置文件中默认的目录和文件名,所以没有写但单独的调用
```

5. 检查配置文件并重启httpd服务,浏览器单独验证httpd是否支持HTTP/2.0协议

```shell
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl start

```


效果展示:

![[Pasted image 20240930163952.png]]

Chrome 浏览器查看:开发者模式 —> Network —>  右键标题勾选 Protocol —> 查看 Protocol 为 h2
Firefox 浏览器查看:开发者模式 —> Network —> 网页头信息 Headers —> Version: HTTP/2.0
Safari 浏览器查看:开发者模式 —> Resources —> 网页头信息 —> Resource —> Protocol HTTP/2

#### ==2. 实验二Nginx在反向代理apache接收用户请求并实现加密和http2.0==

原理:Nginx在反向代理模式下,只需在nginx端保留加密和Http2.0协议即可,apache无需保留,因为真正接收用户请求的nginx,只需要nginx加密即可

原理图:![[Pasted image 20241004144424.png]]
1. 下载Nginx源码软件包

[nginx news](https://nginx.org/)

2. 编译安装nginx软件包

   ```shell
   #安装支持HTTP/2.0的库
   yum -y install gcc gcc-c++ pcre-devel openssl openssl-devel expat-devel libnghttp2-devel
tar -xf nginx-1.27.1.tar.gz 
 cd nginx-1.27.1/
 useradd -r -s /sbin/nologin nginx
  ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module
  make && make install
  
   ```

3. 修改配置文件,开启SSL和HTTP/2.0

   ```shell
            cd /usr/local/nginx/conf
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt
vim nginx.conf
   user nginx ;
   worker_processes  auto;
   http {
        server {
                 listen       80;
                 server_name  www.bbs1.com;
                 location / {
                     root   html;
                     index  index.html index.htm;
                     rewrite ^(.*)$ https://www.bbs1.com$1;
      }
    }

           server {
               listen    443 ssl;
               http2 on;
               server_name  www.bbs1.com;
               ssl_certificate     server.crt;
               ssl_certificate_key server.key;
               ssl_session_cache    shared:SSL:1m;
               ssl_session_timeout  5m;
               ssl_ciphers  HIGH:!aNULL:!MD5;
               ssl_prefer_server_ciphers  on;
               location / {
                   root   html;
                   index  index.html index.htm;
                   proxy_pass   http://192.168.90.103:80;
           }
     } 
   }
   # http2 on;开启http2.0 proxy_pass   http://192.168.90.103:80;反向代理apache服务器
   ```
4. 在另一台服务器上编译安装httpd软件

```shell
tar -xf apr-1.7.0.tar.gz 
tar -xf apr-util-1.6.1.tar.gz
cp -r apr-1.7.0 httpd-2.4.46/srclib/apr
cp -r apr-util-1.6.1 httpd-2.4.46/srclib/apr-util
 yum -y install gcc gcc-c++ pcre-devel openssl openssl-devel expat-devel 
cd httpd-2.4.46/
./configure --prefix=/usr/local/apache2 --sysconfdir=/usr/local/apache2/etc --with-included-apr  --enable-expires=shared 
 make && make install

```
   

5. 重启Nginx服务,验证HTTP/2.0效果

   ```shell
  /usr/local/apache2/bin/apachectl stop
  /usr/local/nginx/sbin/nginx
   ```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/889063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue集成echarts实现统计图表

目录 一、概述 二、Vue实现echarts图表模版 三、测试运行项目 一、概述 官网地址&#xff1a;https://echarts.apache.org/examples/zh/index.html 目前的官网的echarts例子比较古老&#xff0c;如果集成Vue里面需要进行修改&#xff0c;所以可以新建一个Vue的项目代码&am…

红帽操作系统Linux基本命令2( Linux 网络操作系统 06)

本文接着上篇Linux常用命令-1继续往后学习其他常用命令。 2.3 目录操作类命令 1&#xff0e;mkdir命令 mkdir命令用于创建一个目录。该命令的语法为&#xff1a; 上述目录名可以为相对路径&#xff0c;也可以为绝对路径。 mkdir命令的常用参数选项如下。 -p&#xff1a;在创…

Linux dlsym和直接调用函数地址解析分析

dlsym 函数是 Linux 下动态链接库&#xff08;shared library&#xff09;编程中的一个重要函数。它用于在运行时获取动态链接库中符号的地址&#xff0c;通常用于获取函数指针或变量的地址。 以下是 dlsym 函数的基本用法和示例。 1. 函数原型 void *dlsym(void *handle, c…

【Ubuntu】在Ubuntu上配置Java环境

【Ubuntu】在Ubuntu上配置Java环境 壹、前言 Java是运用得非常广泛的编程语言&#xff0c;在使用Linux时难免会碰到需要用到JDK的情况&#xff0c;故本文介绍如何在Ubuntu上配置Java21环境。 贰、下载 Java的下载渠道很多&#xff0c;有甲骨文公司的“官方”JDK&#xff0c…

Linux系统本地搭建轻量级文件共享系统PicoShare远程连接实战

前言 本篇文章介绍&#xff0c;如何在Linux系统本地部署轻量级文件共享系统PicoShare&#xff0c;并结合Cpolar内网穿透实现公网环境远程传输文件至本地局域网内文件共享系统。 PicoShare 是一个由 Go 开发的轻量级开源共享文件系统&#xff0c;它没有文件限制&#xff0c;允…

C#绘制动态曲线

前言 用于实时显示数据动态曲线&#xff0c;比如&#xff1a;SOC。 //用于绘制动态曲线&#xff0c;可置于定时函数中&#xff0c;定时更新数据曲线 void DrawSocGraph() {double f (double)MainForm.readData[12]; //display datachart1.Series[0].Points.Add(f);if (ch…

Anaconda环境管理

1.在Anaconda Prompt下确定python版本 conda create -n pytorch python3.6 2.输入“y”将所需包加入&#xff0c;创建环境 3. 输入“activate pytorch”即为操作成功 4.输入“pip list”查看当前环境

鸿蒙next开发第一课03.ArkTs语法介绍-案例

前面已经学习了ArkTs的基本语法和DevEcoStudio的基本操作&#xff0c;接下来按照官方提示开发一个基本案例。 该案例是系统自带的demo&#xff0c;下载下来源代码后可以直接运行。 接下来我来演示如何运行demo。我在demo中加入了自己的注释。 切记&#xff1a;文件夹不能有中…

Chainlit集成Dashscope实现语音交互网页对话AI应用

前言 本篇文章讲解和实战&#xff0c;如何使用Chainlit集成Dashscope实现语音交互网页对话AI应用。实现方案是对接阿里云提供的语音识别SenseVoice大模型接口和语音合成CosyVoice大模型接口使用。针对SenseVoice大模型和CosyVoice大模型&#xff0c;阿里巴巴在github提供的有开…

一文解读数据中台附搭建指南

数据是企业的核心资产&#xff0c;更是企业数字化转型的关键驱动力。为了更好地管理和利用数据&#xff0c;进行数据共享&#xff0c;充分发挥数据的作用&#xff0c;越来越多的企业开始构建实时数据中台。 一数据中台 定义&#xff1a;数据中台是将企业内部各个部门、系统、应…

无理工科背景的零基础小白如何入门AI?AI学习资料分享

引言 信息爆炸的时代&#xff0c;加上AI技术的加持&#xff0c;如今想要找到学习和了解AI相关技术的资料并不难。但也正是因为信息数量太多&#xff0c;质量参差不齐&#xff0c;筛选高质量的学习资料自是会花费许多功夫。 这一年多来&#xff0c;作为一名没有任何理工科背景…

绘图技巧 | 矩形树状图(Treemap)绘图技巧分享~~

今天这篇推文&#xff0c;小编还是像往常一样交给大家绘图技巧&#xff0c;今天的主角就是-*树形矩阵图(Treemap)*。绘制树形图使用R或者Python都是可以绘制的&#xff0c;今天我们还是使用R进行绘制(Python绘制结果为交互式&#xff0c;后面统一介绍相应的库)。在R中有专门的包…

Python(十一)-__init__()方法,__str__()方法,__del__()方法

目录 魔法方法 无参__init__()方法 有参__init__()方法 __str__()方法 __del__()方法 魔法方法 魔法方法指的是&#xff1a;可以给Python类增加魔力的特殊方法。有两个特点&#xff1a; &#xff08;1&#xff09;总是被双下划线所包围&#xff1b; &#xff08;2&…

windows下载Redis

1.下载地址 Releases tporadowski/redis GitHub 下载后&#xff0c;将压缩包解压到你的文件夹即可。&#xff08;此时&#xff0c;redis已经完成安装&#xff09; 2.使用 2.1双击redis.server.exe即可启动&#xff08;启动redis服务端&#xff09;&#xff08;或者在当前目…

软件工程pipeline梳理

文章目录 软件工程pipeline梳理为什么需要梳理软件工程的pipeline软件工程pipeline的概念与注意点软件工程pipeline中的最大挑战rethink相关资料 软件工程pipeline梳理 为什么需要梳理软件工程的pipeline 反思自己日常工作中的认知和行为。以算法/软件工程师为代表的技术工种往…

Ubuntu有关redis的命令

防火墙&#xff1a; systemctl status firewalld systemctl stop firewalld systemctl disable firewalld.service ifconfig查看ip地址 redis.conf在/etc/redis下&#xff0c;但是得sudo -i进入root模式 进入/etc/redis下开启redis-server服务 查看6379端口是否可以访问 net…

RabbitMQ篇(基本介绍)

目录 一、简介 二、作用 三、AMQP协议 1. 简介 2. 核心概念 四、工作原理 五、工作模式 1. 普通模式 2. Worker模式 3. PubSub模式 4. Rounting模式 5. Topic模式 6. RPC模式 7. Publisher Confirms模式 六、基本结构 七、常见五个角色 一、简介 RabbitMQ 是一…

浅谈2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者

目录 1.概述 1.1. 跨学科的融合 1.2. 推动科学研究的工具 1.3. 对科学界的激励 1.4. 技术的社会影响 2.机器学习与神经网络的发展前景 2.1.具体应用与作用 2.1.1. 医疗健康 2.1.2. 金融 2.1.3. 制造业 2.1.4. 交通与物流 2.1.5. 零售 2.2.未来展望 2.3.科学研究与…

基于opencv的人脸闭眼识别疲劳监测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

VS新建项目默认路径设置

Visual Studio 中打开菜单 “工具”→“选项”→项目和解决方案 →“位置” 标签。“项目位置” 一栏就是设置新建项目默认路径的地方。 新建项目即可 到设置路径。