HTTP 1.0、HTTP 1.1 和 HTTP 2.0 区别

HTTP 1.0、HTTP 1.1 和 HTTP 2.0 是超文本传输协议(HTTP)不同版本的规范,各自进行了多项更新和改进:

1. HTTP/1.0

  • 单一请求-响应:每次请求都需要建立一个新的 TCP 连接,完成后立即断开。
  • 无状态连接:服务器无法保存客户端的状态信息。
  • 缺少持久连接:无法复用连接,每次请求都要重新建立 TCP 连接。
  • 缓存控制:采用 Expires 头字段指定缓存到期时间,但不够灵活。

2. HTTP/1.1

  • 持久连接:默认启用持久连接(Connection: keep-alive),允许一个 TCP 连接复用多次请求,降低了连接建立和关闭的开销。
  • 分块传输编码:支持分块传输(Transfer-Encoding: chunked),可以在不确定消息长度时逐块传输数据,提高了实时性。
  • 带宽优化:支持内容协商(Content Negotiation),根据客户端的能力动态返回合适的资源版本。
  • 新增缓存机制:引入了 Cache-Control 头,提供更灵活的缓存控制。
  • Host 头:允许在同一 IP 上部署多个域名,不同请求通过 Host 头区分。

3. HTTP/2.0

  • 多路复用:在一个连接上支持多个请求和响应的并发,解决了 HTTP/1.x 的“队头阻塞”问题,提升了资源加载效率。
  • 二进制分帧:使用二进制格式传输请求和响应,代替了 HTTP/1.x 的纯文本,便于解析。
  • 头部压缩:通过 HPACK 算法压缩 HTTP 头部,减少了带宽消耗。
  • 服务端推送:允许服务器在客户端请求之前主动推送资源(如 JS、CSS),加速页面加载。

总结

  • HTTP/1.0:每次请求建立新连接,效率低,基本已淘汰。
  • HTTP/1.1:增加持久连接和缓存机制,优化了传输效率,至今仍在广泛使用。
  • HTTP/2.0:支持多路复用和服务端推送,提升了加载性能,逐渐普及中。

为什么http1.0 Expires 头字段指定缓存到期时间,不够灵活

Expires 头字段在 HTTP/1.0 中用于缓存控制,其值是一个绝对时间(即 GMT 时间),用于指定资源的过期时间。例如:

Expires: Wed, 21 Oct 2023 07:28:00 GMT

之所以说它“不够灵活”,主要原因在于以下几点:

1. 依赖客户端的时间设置

  • Expires 依赖客户端的本地时间来判断资源是否过期。如果客户端的时间设置不准确或者时区不同步,可能导致缓存行为不一致,比如资源过早过期或误认为未过期。

2. 无法实现相对时间控制

  • Expires 只能指定一个固定的绝对过期时间,而无法表示“从请求时间开始,缓存多长时间”。如果服务端更新了资源,必须同步更新所有的 Expires 时间,不然客户端可能会继续使用已过期的缓存。

3. 不支持更复杂的缓存策略

  • Expires 缺乏灵活性,无法表达一些更细化的缓存需求,比如短期缓存、重新验证缓存等。在动态内容较多的场景中,绝对时间很难满足需求,容易导致缓存失效过多或过期缓存被误用。

Cache-Control 作为替代方案

  • 在 HTTP/1.1 中,引入了 Cache-Control 头,允许使用相对时间(如 max-age=3600 表示缓存 3600 秒),解决了 Expires 的不足。
  • Cache-Control 还提供了更多控制选项(如 no-cacheno-storemust-revalidate),使缓存策略更加灵活和细化。

因此,Expires 因为绝对时间的限制不够灵活,而 Cache-Control 则通过支持相对时间和更多选项,增强了缓存控制的灵活性和精确度。

http2.0 在http1 上有哪些优化点

1. 多路复用

  • HTTP/1.1:每个 TCP 连接只能处理一个请求,必须等待当前请求完成才能发送下一个请求(容易造成队头阻塞)。
  • HTTP/2:支持在一个连接上同时发送多个请求和响应,不再受限于“一个连接一个请求”的限制,这大大减少了连接开销,解决了 HTTP/1.1 中的队头阻塞问题。
  • 优势:提升了页面加载速度,特别是对多个静态资源并发请求时,显著减少了延迟。

2. 二进制分帧

  • HTTP/1.1:使用纯文本协议传输数据,存在较多的解析开销。
  • HTTP/2:采用二进制分帧层,将数据分成更小的帧,并以二进制格式传输。请求和响应被分成独立帧,可以乱序发送,最后在客户端重新组装。
  • 优势:提高了传输效率,并降低了协议解析的复杂性。

3. 头部压缩

  • HTTP/1.1:每个请求和响应都携带完整的头部,尤其在较多资源请求时,带来重复的数据传输开销。
  • HTTP/2:采用 HPACK 算法对头部进行压缩,并引入头部表(Header Table)来存储重复的头字段,仅传输增量更新。
  • 优势:减少了带宽消耗和网络延迟,特别是在包含大量相同头部的请求中效果显著。

4. 服务器推送

  • HTTP/1.1:浏览器只能请求页面中引用的资源,不能预先获取相关资源。
  • HTTP/2:允许服务器在客户端请求之前主动推送资源,如 CSS、JS、图片等,不必等待客户端发起请求。
  • 优势:提前将关键资源推送给客户端,减少等待时间,提高页面首次加载速度。

5. 连接共享

  • HTTP/1.1:为了避免队头阻塞,通常会打开多个 TCP 连接,但这增加了服务器和客户端的资源开销。
  • HTTP/2:一个连接上可以处理多个流,减少了打开多个连接的必要,从而降低了资源消耗。
  • 优势:提高了网络资源利用率,更适合高并发场景。

总结

HTTP/2 的这些改进,使得其在数据传输的效率、加载速度、延迟和带宽占用等方面都有了显著优化,在加载复杂页面和处理大量资源时,HTTP/2 相比 HTTP/1.1 有明显的性能优势。

如何开启HTTP/2.0

1. 使用支持 HTTP/2 的服务器

  • Apache:需要开启 HTTP/2 模块。
  • Nginx:版本需在 1.9.5 或以上。
  • Node.js:通过 HTTP/2 模块支持。
  • 其他服务器:例如 IIS 10 及以上版本也支持 HTTP/2。

2. 启用 HTTPS(TLS)

  • 虽然 HTTP/2 协议并未强制要求 HTTPS,但主流浏览器(如 Chrome、Firefox)只在 HTTPS 下支持 HTTP/2。
  • 确保网站已配置 SSL/TLS 证书,并且能够通过 https:// 访问。

3. 配置服务器以支持 HTTP/2

根据服务器类型进行相应配置:

  • Nginx 示例 在 Nginx 配置文件中,将 listen 指令配置为支持 HTTP/2:

    复制代码

    server {listen 443 ssl http2;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;...
    }

  • Apache 示例 在 Apache 配置文件中,启用 HTTP/2 模块并更新 SSL 配置:apache

    LoadModule http2_module modules/mod_http2.so
    Protocols h2 http/1.1

4. 前端验证

  • 部署后,通过浏览器的 开发者工具 进行验证。打开 Network(网络) 面板,查看请求的 Protocol 列,确认是否为 h2
  • 可以使用命令行工具 curl 验证协议。例如:

    curl -I -k --http2 https://your-domain.com

通过上述配置,前端资源将自动通过 HTTP/2 进行传输,提升加载速度。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css数据不固定情况下,循环加不同背景颜色

<template><div><p v-for"(item, index) in items" :key"index" :class"getBackgroundClass(index)">{{ item }}</p></div> </template><script> export default {data() {return {items: [学不会1, …

【计算机网络安全】湖北大学-mysql事务隔离性实验

参考数据库实验&#xff1a;并发控制实验&#xff08;MySQL&#xff09;-CSDN博客&#xff0c;大佬写的很好 目录 实验环境 事务的隔离级别 1. 读未提交 2. 读已提交 3. 可重复读 4. 序列化 三种要解决的并发问题 1. 脏读&#xff08;Dirty Read&#xff09; 2. 不可重…

版本控制【Git Bash】【Gitee】

目录 一、什么是版本控制&#xff1f; 二、版本控制的种类&#xff1a; 1、本地版本控制 2、集中版本控制 3、分布式版本控制 三、下载Git Bash 四、Git Bash 配置 五、Git Bash使用 1、切换目录&#xff1a;cd 2.查看当前文件路径&#xff1a;pwd 3.列出当前目录下文件…

Qt中实现旋转动画效果

使用QPropertyAnimation类绑定对应的属性后 就可以给这个属性设置对应的动画 //比如自定义了属性 Q_PROPERTY(int rotation READ rotation WRITE setRotation)//给这个属性加动画效果 //参数1&#xff1a;谁要加动画效果 //参数2&#xff1a;哪个属性加动画效果 //参数3&…

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令&#xff0c;并解决三个常见报错&#xff1a; 权限被拒绝&#xff08;Permission Denied&#xff09;无法连接到 Docker 仓库&#xff08;Timeout Exceeded&#xff09;磁盘空间不足&#xff08;No Space Left on Device&#xff09; 命令以…

web——upload-labs——第十关——.空格.绕过

审计源码 这次先删除文件名左右的空格&#xff0c;然后又删除了我们文件末尾的.&#xff0c;其次将我们上传的文件名转换为小写&#xff0c;删除文件末尾的::$DATA&#xff0c;最后又删除了文件名左右两侧的空格 根据他的逻辑&#xff0c;我们可以构造文件名phpinfo.php. .就是…

Python | Leetcode Python题解之第564题数组嵌套

题目&#xff1a; 题解&#xff1a; class Solution:def arrayNesting(self, nums: List[int]) -> int:ans, n 0, len(nums)for i in range(n):cnt 0while nums[i] < n:num nums[i]nums[i] ni numcnt 1ans max(ans, cnt)return ans

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

如何在项目中用elementui实现分页器功能

1.在结构部分复制官网代码&#xff1a; <template> 标签: 这是 Vue 模板的根标签&#xff0c;包含所有的 HTML 元素和 Vue 组件。 <div> 标签: 这是一个普通的 HTML 元素&#xff0c;包裹了 el-pagination 组件。它没有特别的意义&#xff0c;只是为了确保 el-pagi…

海量数据面试题

目录 前言 什么是海量数据 一、利用位图解决 二、利用布隆过滤器解决 三、利用哈希切割解决 前言 在大数据时代&#xff0c;海量数据处理已成为技术领域中的一项重要课题。无论是企业级应用、互联网平台&#xff0c;还是人工智能和机器学习的实现&#xff0c;都离不开对大规…

Diff 算法的误判

起源&#xff1a; 设想一下&#xff0c;假如你桌面上的文件都没有文件名&#xff0c;取而代之的是&#xff0c;你使用通过文件的位置顺序即index来区分它们———第一个文件&#xff0c;第二个文件&#xff0c;以此类推。也许这种方式可行&#xff0c;可是一旦你删除了其中的一…

基于Java Springboot幼儿园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

Misc_01转二维码(不是二进制)

例题ctfhub/隐写v2.0 打开是一张图片 文件分离得到zip&#xff0c;爆破密码得到7878 打开得到0和1&#xff0c; !!!不是二进制转图片&#xff0c;直接是二维码 缩小能看到 000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS&#xff0c;包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务&#xff0c;成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践&#xff0c;如检查文件存在性以避免重复创建&#xff0c;以及处理HDFS安全…

MySQL时间字段TIMESTAMP和DATETIME

SELECT global.time_zone, session.time_zone;查询数据库的全局时区和当前会话的时区信息&#xff0c;一般如果使用navicat进行连接&#xff0c;没有显示指定时区信息&#xff0c;会默认使用system_time_zone。 可以使用 SET time_zone 08:00; SELECT global.time_zone, sess…

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面&#xff0c;创建自己的项目 2、点击自己创建好的项目&#xff0c;在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…

【JavaEE初阶 — 多线程】定时器的应用及模拟实现

目录 1. 标准库中的定时器 1.1 Timer 的定义 1.2 Timer 的原理 1.3 Timer 的使用 1.4 Timer 的弊端 1.5 ScheduledExecutorService 2. 模拟实现定时器 2.1 实现定时器的步骤 2.1.1 定义类描述任务 定义类描述任务 第一种定义方法 …

一文了解 inductive bias(归纳偏好)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 归纳偏好&#xff08;Inductive Bias&#xff09;是机器学习中的一个非常基础但又非常重要的概念。为了更好地理解它&#xff0c;我们先从 “归纳” 和 “偏好” 这两个词开始讲解。 什么是归纳&#x…

【电子设计】按键LED控制与FreeRTOS

1. 安装Keilv5 打开野火资料,寻找软件包 解压后得到的信息 百度网盘 请输入提取码 提取码:gfpp 安装526或者533版本都可以 下载需要的 F1、F4、F7、H7 名字的 DFP pack 芯片包 安装完 keil 后直接双击安装 注册操作,解压注册文件夹后根据里面的图示步骤操作 打开说明 STM…