十二HTTP 2.0

news2024/10/11 4:29:21

# 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.coloradmin.cn/o/2204015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

由于找不到krpt.dll,无法继续执行代码该怎么办?总结三种简单有效修复方法

1. krpt.dll 简介 1.1 定义 krpt.dll 是一个 Windows 动态链接库文件&#xff08;Dynamic Link Library&#xff09;&#xff0c;这种类型的文件包含可由多个应用程序共享的函数和资源。它是Windows操作系统中的一个重要组件&#xff0c;对于系统的正常运行起着至关重要的作用…

模块化沙箱的功能特点

模块化沙箱是一种高灵活性和高扩展性的数据安全产品&#xff0c;通过选择不同的沙箱模块&#xff0c;满足不同的安全需求。 同时&#xff0c;深信达模块化沙箱&#xff0c;根据企事业单位各类国密标准需求&#xff0c;合理转换沙箱模式&#xff0c;满足不同场景、不同类型的数…

TK东南亚、美区、英区产品投放内容该如何选择?

TikTok是抖音在海外市场的版本&#xff0c;已经成为全球最受欢迎的短视频应用之一&#xff0c;并被视为品牌国际化的重要平台。卖家若能有效利用 TikTok&#xff0c;有望在全球范围内提升企业知名度和产品销量&#xff0c;吸引大量的粉丝和订单。那么&#xff0c;在不同国家&am…

每日论文13-18TCAS2数控调谐电感的V波段CMOS压控振荡器

《A V-Band CMOS VCO With Digitally-Controlled Inductor for Frequency Tuning》 18TCAS2 广东省毫米波与太赫兹重点实验室 有个手头上的东西感觉粗调电感可能会比粗调电容好一些&#xff0c;所以拜读一下老板18年的这篇TCAS2&#xff0c;这感觉是个偏理论一点的工作。 首…

哇塞!FLUX 杠上 Midjourney,你选谁?

大家和大家聊聊最近超火的 AI 绘图工具 ——Black Forest Labs 的 FLUX 和一直备受青睐的 Midjourney。 来源&#xff1a;blackforestlabs.ai FLUX 这套开源的文本转图像模型一经推出&#xff0c;就掀起了不小的波澜。好多设计同行都对它充满了好奇与期待&#xff0c;这无疑给…

封装、继承、抽象类

面向对象共有三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。 封装 封装表现&#xff1a; &#xff08;1&#xff09;方法就是一个最基本封装体。 &#xff08;2&#xff09;类其实也是一个封装体。 封装的好处&#xff1a; &#xff08;1&#xff09;提高…

Jquery serialize()、serializeArray()、$.param()

param()方法 1.定义&#xff1a;param() 方法创建**数组或对象**的序列化表示。》》该序列化值可在进行 AJAX 请求时在 URL 查询字符串中使用。2.语法&#xff1a;$.param(object,trad)object&#xff1a;必需&#xff0c;规定要序列化的数组或对象。trad&#xff1a;可选。布尔…

如何提高LabVIEW编程效率

提高LabVIEW编程效率对开发者来说非常重要&#xff0c;尤其是在处理复杂项目或紧迫的开发周期时。以下是一些可以显著提升LabVIEW编程效率的技巧&#xff0c;从代码结构、工具使用到团队协作的多个角度进行详细分析&#xff1a; 1. 模块化设计 模块化设计 是提高代码可维护性和…

Linux——grep-wc-管道符

grep命令 利用关键字过滤文件行&#xff0c;找到关键字所在那一行 wc命令 统计文件行数&#xff0c;单词数量 wc命令 不带选项全选 wc -c test.txt 字节bytes数量 wc -m test.txt 字符数量 wc -l test-txt 行数 wc -w test-txt 单词数量 管道符 | 将左边命令的…

【LLM论文日更】| BGE-M3E embedding模型

论文&#xff1a;https://arxiv.org/pdf/2402.03216代码&#xff1a;GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构&#xff1a;BAAI领域&#xff1a;embedding model发表&#xff1a; ​ 研究背景 研究问题&#xff1a;这篇文章要解决的问…

AI时代大厂AI项目管理学习路线

AI时代避免被裁员&#xff0c;大厂AI项目管理学习路线主要包括&#xff1a; 1、AI项目管理基础技能。 2、项目管理AI技术知识。 3、数据分析与决策。 4、AI项目管理工具。 5、AI项目管理知识扩展。 01 AI项目管理基础技能。 AI项目管理基础技能构成了项目管理的骨架&…

SQL 干货 | 使用 EXISTS 编写 SELECT 查询

基于 SQL 中的 EXISTS 运算符为我们提供了一种基于其他数据是否存在&#xff08;或不存在&#xff09;来检索数据的简便方法。更具体地说&#xff0c;它是一个逻辑运算符&#xff0c;用于评估子查询的结果&#xff0c;并返回一个布尔值&#xff0c;该值指示是否返回了行。尽管 …

《用comfyUI挑战全网AI图片产品实践案例》之comfyUI抠图工作流,用免费打败收费,实现素材自由

近段时间AI非常的火。目前有很多软件已经拥抱了AI&#xff0c;加入了AI的一些功能。像AI绘画的功能&#xff0c;基本上是每个大厂的软件产品都会配备。但是呢&#xff0c;这些功能都是要付费的。而且是按月收费或者是按年收费。整体算下来十分的不划算。所以我尝试用stable dif…

基础岛 第3关 :浦语提示词工程实践

作业 基础任务 (完成此任务即完成闯关) 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为13.8<13.11。 任务要求&#xff1a;利用…

嵌入式面试——FreeRTOS篇(五) 事件标志组

本篇为&#xff1a;FreeRTOS事件标志组篇 1、事件标志组介绍 答&#xff1a; 事件标志位&#xff1a;用一个位&#xff0c;来表示事件是否发生。 事件标志组是一组事件标志位的合集&#xff0c;可以简单的理解事件标志组&#xff0c;就是一个整数。 2、事件标志组的特点 答&am…

R包:APAlyzer从RNA-seq数据计算APA表达丰度

文章目录 介绍教程实战案例数据脚本运行 介绍 今天安利APAlyzer工具&#xff0c;它是通过RNA-seq数据获取3′UTR APA, intronic APA等表达谱的R包。 APAlyzer将bam文件比对到PolyA-DB数据库识别APA。 Most eukaryotic genes produce alternative polyadenylation (APA) isofo…

App推广新利器:Xinstall带你直达指定页面

在移动互联网时代&#xff0c;App的推广与运营对于企业的发展至关重要。然而&#xff0c;如何让用户在推广过程中更便捷地访问到App内的指定页面&#xff0c;一直是困扰开发者和运营者的难题。今天&#xff0c;我们就来介绍一款名为Xinstall的SDK&#xff0c;它能帮助你轻松实现…

Python中10个让你代码更安全的网络请求处理技巧

对Python感兴趣&#xff0c;想要有更深入了解的朋友可以试试我的这份学习方法和资料&#xff0c;​​​​​点这里免费获取 引言 在 Python 网络编程中&#xff0c;使用 requests 库进行 HTTP 请求是一种常见且高效的方式。该库不仅提供了简洁易用的 API&#xff0c;还支持多…

3分钟理清QPS、TPS、RT 以及它们之间的关系

在评估系统性能的时候&#xff0c;我们经常会听到 QPS、TPS、RT、吞吐量等等一些概念&#xff0c;包括在一些面试场景下可能也会遇到这些概念&#xff0c;我们来稍微梳理一下。 做一个简单的概念扫盲。 一 QPS QPS&#xff08;Queries Per Second&#xff09; 是每秒的查询率…

上市四天暴涨又暴跌,扫描全能王背后公司坐上“过山车”

股价四天涨五倍&#xff0c;遇到回调跌一半&#xff0c;扫描全能王母公司——合合信息&#xff0c;一上市就坐上了“过山车”。 合合信息其实早在2021年就向科创板申请上市&#xff0c;并在2023年成功过会&#xff0c;但直到9月13日才开启申购&#xff0c;IPO之路一走就是三年…