当前位置: 首页 > news >正文

HTTP 多个版本

了解一下各个版本的HTTP。

上个世纪90年代初期,蒂姆·伯纳斯-李(Tim Berners-Lee)及其 CERN的团队共同努力,制定了互联网的基础,定义了互联网的四个构建模块:

  • 超文本文档格式(HTML)

  • 数据传输协议(HTTP)

  • 用于查看超文本的网络浏览器(第一个浏览器,WorldWideWeb)

  • 用于传输数据的服务器(httpd的早期版本)

HTTP重用了现有的 TCP/IP 协议来进行数据传输,其中 HTTP 消息字节位于应用层,如下图中的浅蓝色所示。

图片

1、HTTP/0.9

这是第一个 HTTP草案。它只有一个 GET方法,也不支持头部或状态代码;唯一可用的数据格式是 HTML。就像 HTTP/1.0和 HTTP/1.1一样,HTTP消息以 ASCII文本结构呈现。

HTTP/0.9请求的示例:

GET /mypage.html

响应示例:

<html>A verysimple HTML page</html>

2、HTTP/1.0

这个版本定义了现在所用的 HTTP结构,类似于一份备忘录,同时引入了新的方法(HEAD和POST)、MIME类型、状态码和协议版本。

HTTP/1.0请求的示例:​​​​​​​

GET /mypage.html HTTP/1.0User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

响应示例:​​​​​​​

200 OKDate: Tue, 15 Nov 1994 08:12:31 GMTServer: CERN/3.0 libwww/2.17Content-Type: text/html<HTML>A page with an image<IMGSRC="/myimage.gif"></HTML>

3、HTTP/1.1

这个版本于1997年初推出,距离其前身只有几个月。主要变化包括:

  • 持久的TCP连接(keep-alive),可以节省机器和网络资源。在之前的版本中,每个请求都要打开一个新的TCP连接,并在响应后关闭。

  • Host头部,支持在同一个IP下有多个服务器。

  • 有关编码、缓存、语言和MIME类型的头部约定。

HTTP/1.1请求的示例:​​​​​​​

GET /api/fruit/orange HTTP/1.1Host: www.fruityvice.comAccept-Encoding: gzip, deflate, br

响应示例:​​​​​​​

HTTP/1.1 200 OKServer: nginx/1.16.1Date: Sun, 10 Mar 2024 20:44:25 GMTTransfer-Encoding: chunkedConnection: keep-aliveX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockCache-Control: no-store, must-revalidate, no-cache,max-age=0Pragma: no-cacheX-Frame-Options: DENYContent-Type: application/jsonExpires: 0{"name":"Orange","id":2,"family":"Rutaceae","order":"Sapindales","genus":"Citrus","nutritions":{"calories":43,"fat":0.2,"sugar":8.2,"carbohydrates":8.3,"protein":1.0}}

图片

4、HTTP/2

2015年,在对互联网性能进行多年观察和研究后,人们基于谷歌的 SPDY协议,提出并建立了 HTTP/2。

它与 HTTP/1.1有很多不同,包括将多个消息复用到单个 TCP数据包中、消息的二进制格式以及用于头部的 HPACK压缩。

在 HTTP/1.1中,两个请求不能共享同一个 TCP连接,必须等待第一个请求结束后才能开始后续请求。这被称为头部阻塞。在下面的图表中,由于只使用了一个 TCP连接,请求2必须等到响应1到达之后才能发送。

图片

HTTP/2通过流(stream)解决了这个问题,每个流对应一个消息。许多流可以交错在单个 TCP数据包中。如果某个流由于某种原因无法发送其数据,其他流可以在 TCP数据包中顶替它。

HTTP/2的流被分成帧(frame),每个帧包含:帧类型、它所属的流以及长度(以字节为单位)。在下面的图表中,彩色矩形是一个 TCP数据包,✉ 代表其中的一个 HTTP/2帧。第一个和第三个 TCP数据包携带了不同流的帧。

图片

下面的图像展示了帧如何放置在 TCP数据包中。流1携带了一个 JavaScript文件的 HTTP响应,而流2携带了一个 CSS文件的 HTTP响应。

图片

5、HTTP/3

HTTP/3诞生于一个名为 QUIC的新传输协议,该协议由谷歌于2012年创建。QUIC被封装在 UDP内,与 TCP相比,它有以下优点:

  • 建立连接和TLS身份验证的往返包数量更少;

  • 在处理数据包丢失方面具有更强的连接韧性;

  • 解决了TCP和TLS中存在的头部阻塞问题。

HTTP/2解决了 HTTP头部阻塞问题,但是,这个问题在 TCP和 TLS中也存在。TCP认为它需要发送的数据是一系列连续的数据包,如果有任何数据包丢失,必须重新发送,以保持信息的完整性。在 TCP中,直到丢失的数据包成功重新发送到目的地之前,后续的数据包都不能被发送。

下面的图示直观地解释了在 HTTP/2中这种情况是如何发生的。第二个数据包只包含了响应1的帧,但是它的丢失延迟了响应1和响应2,这意味着在这种情况下没有并行处理。

图片

为了解决 TCP的头部阻塞问题,QUIC决定使用 UDP作为传输协议,因为UDP不保证到达。在TCP中作为传输层的数据完整性责任被移至QUIC的应用层,消息的帧可以无序到达,而不会阻塞不相关的流。

图片

图片

与 TCP相关的 TLS(SSL)中的头部阻塞是因为加密通常应用于整个消息内容,这意味着需要接收所有数据之后才能进行解密。使用 QUIC时,加密是针对每个 QUIC数据包的,到达时就可以进行解密,而无需预先接收所有数据包。

带有 TLS的 TCP:

1. 输入:A+B+C

2. 加密:crypt(A+B+C) = D+E+F

3. 数据包:D, E, F

4. 接收:decrypt(D+E+F)

5. A+B+C

带有TLS的QUIC:

1. 输入:A+B+C

2. 加密:crypt(A) = X, crypt(B) = Y, crypt(C) = Z

3. 包:X, Y, Z

4. 接收:decrypt(X) + decrypt(Y) + decrypt(Z)

5. A+B+C

6、比较表

图片

* TLS 1.2需要2次往返进行加密握手,而 TLS 1.3只需要1次,还有 0-RTT(零往返时间恢复)选项,其中不需要先前的握手。然而,0-RTT会导致重放攻击,因此是不安全的。

** QUIC的连接 ID可能被用于指纹识别,一项研究指出,这存在对用户隐私的风险。

7、哪个版本最好?

目前最好的两个版本是 HTTP/2和 HTTP/3。

HTTP/3是为不稳定的连接设计的,例如手机和卫星网络。为了应对网络不稳定性,QUIC在数据流之间具有很高的独立性,并且在丢包时具有很好的弹性。然而,HTTP/3也存在性能损失,主要是因为1)由于 UDP的使用率较低,路由器和操作系统在过去几十年里没有对 UDP协议进行优化,使其相对于 TCP而言速度较慢;2)QUIC使用逐个数据包的加密需要更多的数学运算,效率低于 TCP中使用的整个消息加密。此外,UDP协议在某些网络中受到限制,以防止诸如  UDP洪水攻击和 DNS放大攻击等攻击。

在可靠和稳定的连接上,HTTP/2通常比 HTTP/3提供更好的性能。

一般来说,建议进行兼容性和性能测试,以确定哪个版本最合适。此外,服务器可以接受 HTTP/2和 HTTP/3连接,让客户端决定使用哪个版本。

相关文章:

HTTP 多个版本

了解一下各个版本的HTTP。 上个世纪90年代初期&#xff0c;蒂姆伯纳斯-李&#xff08;Tim Berners-Lee&#xff09;及其 CERN的团队共同努力&#xff0c;制定了互联网的基础&#xff0c;定义了互联网的四个构建模块&#xff1a; 超文本文档格式&#xff08;HTML&#xff09; …...

【DevOps】探索Linux命令行世界:深入了解Shell的力量

目录 一、Linux Shell 详细介绍 1. Shell基础概念 2. Shell的功能特性 3. 常用Shell命令与技巧 4. 高级Shell特性与实践 二、常见的Shell及其比较 1. Bash (Bourne Again SHell) 2. Zsh (Z Shell) 3. Fish (Friendly Interactive SHell) 4. Ksh (Korn SHell) 5. Csh …...

互斥量的使用

文章目录 前言一、互斥量与二进制信号量二、优先级反转与优先级继承三、递归锁 前言 通过学习上一章互斥量理论基础&#xff0c;这一章我们来做一些实验进行验证。 一、互斥量与二进制信号量 互斥量使用和二进制信号量类似 互斥量有优先级继承功能&#xff0c;二进制信号量没有…...

关于面试真题的压迫

1.请描述一下您在使用JavaScript进行DOM操作时&#xff0c;如何提高页面性能和用户体验&#xff1f; 使用事件委托&#xff1a;在父元素上监听事件&#xff0c;而不是为每个子元素都添加事件监听器。这样可以减少事件处理程序的数量&#xff0c;提高性能。 缓存DOM查询&#x…...

1700java进销存管理系统Myeclipse开发sqlserver数据库web结构java编程计算机网页项目

一、源码特点 java web进销存管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为sqlser…...

mysql数据库(排序与分页)

目录 一. 排序数据 1.1 排序规则 1.2 单列排序 1.我们也可以使用列的别名&#xff0c;给别名进行排序 2.列的别名只能在 ODER BY 中使用&#xff0c; 不能在WHERE中使用。 3.强调格式&#xff1a;WHERE 需要在 FROM 后&#xff0c; ORDER BY 之前 1.3 二级排序&…...

Android 实时监听Activity堆栈变化(系统应用)

private val mIActivityManager: IActivityManager ActivityManagerNative.asInterface(ServiceManager.getService(Context.ACTIVITY_SERVICE)) 方式一&#xff08;registerProcessObserver&#xff09; &#xff1a; mIActivityManager.registerProcessObserver(mIProcess…...

双目深度估计原理立体视觉

双目深度估计原理&立体视觉 0. 写在前面1. 双目估计的大致步骤2. 理想双目系统的深度估计公式推导3. 双目标定公式推导4. 极线校正理论推导 0. 写在前面 双目深度估计是通过两个相机的对同一个点的视差来得到给该点的深度。 标准系统的双目深度估计的公式推导需要满足:1)两…...

Redis探索之旅(基础)

目录 今日良言&#xff1a;满怀憧憬&#xff0c;阔步向前 一、基础命令 1.1 通用命令 1.2 五大基本类型的命令 1.2.1 String 1.2.2 Hash 1.2.3 List 1.2.4 Set 1.2.5 Zset 二、过期策略以及单线程模型 2.1 过期策略 2.2 单线程模型 2.3 Redis 效率为什么这么高 三…...

C语言/数据结构——每日一题(链表的中间节点)

一.前言 今天我在LeetCode刷到了一道单链表题&#xff0c;想着和大家分享一下这道题&#xff1a;https://leetcode.cn/problems/middle-of-the-linked-list。废话不多说让我们开始今天的知识分享吧。 二.正文 1.1题目描述 1.2题目分析 这道题有一个非常简便的方法——快慢指…...

这是用VS写的一个tcp客户端和服务端的demo

服务端&#xff1a; 客户端&#xff1a; 其实这里面的核心代码就两行。 客户端的核心代码&#xff1a; //套接字连接服务端 m_tcpSocket->connectToHost(_ip,_port);//通过套接字发送数据m_tcpSocket->write(ui.textEditSend->toPlainText().toUtf8());//如果收到信…...

代码随想录算法训练营day18 | 102.二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

102.二叉树的层序遍历 迭代法 层序遍历使用队列&#xff0c;同时记录每层的个数 class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:res []if not root:return resqueue collections.deque()queue.append(root)while queue:size len…...

工厂自动化升级改造参考(01)--设备通信协议详解及选型

以下是整合了通信协议的特点、应用场景、优缺点以及常用接口方式的描述: 以太网/IP: 来历: 以太网是一种局域网技术,由罗伯特梅特卡夫和大卫博格在1973年开发。IP是网络层协议,负责在网络中的设备间传输数据。特点:基于标准的以太网技术,使用TCP/IP协议栈,支持高速数据传…...

数据结构与算法之经典排序算法

一、简单排序 在我们的程序中&#xff0c;排序是非常常见的一种需求&#xff0c;提供一些数据元素&#xff0c;把这些数据元素按照一定的规则进行排序。比如查询一些订单按照订单的日期进行排序&#xff0c;再比如查询一些商品&#xff0c;按照商品的价格进行排序等等。所以&a…...

VSCode通过SSH连接虚拟机Ubuntu失败

问题说明 最近使用VSCode通过SSH连接Ubuntu&#xff0c;通过VSCode访问Ubuntu进行项目开发&#xff0c;发现连接失败 在VSCode中进行SSH配置 这些都没有问题&#xff0c;但在进行连接时候出现了问题&#xff0c;如下&#xff1a; 出现了下面这个弹窗 解决方法 发现当…...

在Codelab对llama3做Lora Fine tune微调

Unsloth 高效微调大模型的工具&#xff0c;通过Unsloth微调Llama3, Mistral, Gemma 速度提升2-5倍&#xff0c;内存减少70%&#xff01; Codelab 创建一个jupyter notebook 选择 T4 GPU 安装Fine tune 相关的lib %%capture import torch major_version, minor_version torch…...

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦 一、前情提要二、目标三、技术方案3.1 读写擦的操作3.1.1 读卡操作3.1.2 写卡操作3.1.3 擦除操作 3.2 一些技术点3.2.1 轮询标志位的选择不唯一3.2.2 写和擦的卡状态查询3.2.3 写的速度 四、代…...

【C++】HP-Socket(三):UdpClient、UdpServer、UdpCast、UdpNode的区别

1、简述 UDP是无连接的&#xff0c;在UDP传输层中并没有客户端和服务端的概念。但是可以在应用层定义客户端和服务端&#xff0c;可以灵活的互换客户端和服务端&#xff0c;或者同时既是客户端也是服务端。 HP-Socket中在应用层定义了四种UDP组件&#xff1a;UdpClient、UdpS…...

java设计模式六 访问者

访问者模式&#xff08;Visitor Pattern&#xff09;是一种设计模式&#xff0c;它允许你将算法附加到对象结构中的各个元素上&#xff0c;而不必修改对象结构本身。它主要用于处理对象结构非常稳定&#xff0c;但频繁需要在此结构上执行不同操作的场景。访问者模式通过将操作移…...

中间件研发之Springboot自定义starter

Spring Boot Starter是一种简化Spring Boot应用开发的机制&#xff0c;它可以通过引入一些预定义的依赖和配置&#xff0c;让我们快速地集成某些功能模块&#xff0c;而无需繁琐地编写代码和配置文件。Spring Boot官方提供了很多常用的Starter&#xff0c;例如spring-boot-star…...

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss...

Ansible---自动化运维工具

一、Ansible概述 1.1 Ansible简介 Ansible是一款自动化运维工具&#xff0c;通过ssh对目标主机进行配置、应用部署、任务执行、编排调度等操作。它简化了复杂的环境管理和自动化任务&#xff0c;提高了工作效率和一致性&#xff0c;同时&#xff0c;Ansible的剧本(playbooks)…...

5.Git

Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html文件等&#xff09;。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种 本地仓库&#xff1a;开发人员自己电脑上的Git仓库远程仓库&#xff1a;远程…...

探索中位数快速排序算法:高效寻找数据集的中间值

在计算机科学领域&#xff0c;寻找数据集的中位数是一个常见而重要的问题。而快速排序算法作为一种高效的排序算法&#xff0c;可以被巧妙地利用来解决中位数查找的问题。本文将深入探讨中位数快速排序算法的原理、实现方法以及应用场景&#xff0c;带你领略这一寻找中间值的高…...

密码学《图解密码技术》 记录学习 第十五章

目录 十五章 15.1本章学习的内容 15.2 密码技术小结 15.2.1 密码学家的工具箱 15.2.2 密码与认证 15.2.3 密码技术的框架化 15.2.4 密码技术与压缩技术 15.3 虚拟货币——比特币 15.3.1 什么是比特币 15.3.2 P2P 网络 15.3.3地址 15.3.4 钱包 15.3.5 区块链 15.3.…...

如何在 Ubuntu 16.04 上为 Nginx 创建自签名 SSL 证书

简介 TLS&#xff0c;即传输层安全协议&#xff0c;及其前身SSL&#xff0c;即安全套接字层&#xff0c;是用于将普通流量包装在受保护的加密包装中的网络协议。 使用这项技术&#xff0c;服务器可以在服务器和客户端之间安全地发送流量&#xff0c;而不会被外部方拦截。证书…...

5.协议的编解码

本章内容其实没有多大难度&#xff0c;主要考察大家的细心程度.计算数据长度然后截取相应字节数组并按照协议进行解码&#xff0c;编码则反之。 1.基础消息的编解码 Override public BasicMessage decode(byte[] bytes) {int dataLength ByteUtil.bytesToInt(ByteUtil.extra…...

数据结构基础| 线性表

线性表 定义 没有元素则为空表 例子: 稀疏多项式的运算 图书信息管理系统 特点 线性结构 同类型 线性表的类型定义 1.基本操作: InitList(&L) 操作结果:构造空的线性表L DestroyList(&L) 初始化条件:线性表L存在 操作结果:销毁线性表L(线性表L不存在) Cle…...

嵌入式学习

笔记 作业 有如下结构体 struct Student{ char name[16]; int age; double math_score; double chinese_score; double english_score; double physics_score; double chemistry…...

sass-loader和node-sass与node版本的依赖问题

sass-loader和node-sass与node版本的依赖问题 没有人会陪你走到最后&#xff0c;碰到了便是有缘&#xff0c;即使到了要下车的时候&#xff0c;也要心存感激地告别&#xff0c;在心里留下空白的一隅之地&#xff0c;多年后想起时依然心存甘味。——林清玄 报错截图 报错信息 np…...

专门做网站的公司有哪些/百度推广介绍

自杀的人虽然对周围人有伤害&#xff0c;但是自己是最大的受害者&#xff0c;所以是值得同情的&#xff0c;在所有的各种死亡中是最可怜的。希望社会能从这些事件中吸取教训&#xff0c;悲剧不要再重演。个人来讲应该学习压力管理和平衡生活的知识&#xff0c;避免对事业过分的…...

吉祥物设计网站/快速提升网站关键词排名

各位程序开发者 大家好。 我是joshiniti。这是我一贯网名&#xff0c;在全球各大社交网站上&#xff0c;我都会使用该网名。感兴趣的开发者我们可以成为朋友&#xff0c;一起谈论开发过程中的点点滴滴。 还是先吐槽一下我的学习经历吧。 本人由于偏科偏的过于厉害&#xff08;高…...

wordpress 字数限制/微商怎么找客源人脉

举步维艰——如何调试显示器点亮前的故障 显示器是个人计算机&#xff08;PC&#xff09;系统中必不可少的输出设备&#xff0c;它是计算机向用户传递信息的首要媒介。用户也正是通过显示器来观察计算机所作的“工作”&#xff0c;与其交流。离开了显示器&#xff0c;我们便很难…...

微网站套餐/产品推广软件有哪些

财务操作手册第1章登录K3及基本操作........................................................................................................................31.1登录及注销远程服务器...............................................................................…...

专业网站建设公/如何进行网站的宣传和推广

关于springboot和shiro的整合&#xff0c;可以参考博文 https://blog.csdn.net/qq_41712271/article/details/105127925 假如&#xff1a; /admin/order roles["admin, root"] &#xff0c;表示 /admin/order 这个接口需要用户同时具备 admin 与 root 角色 才可访问,…...

哪个厂家的logo品牌设计/上海做网络口碑优化的公司

xxx declared static but never defined 【问题描述】uart.c文件中有函数read_sample的实现&#xff1a; static void delay(void) {//statement }uart.h文件中有函数delay的声明&#xff1a;static void delay(void);程序编译的时候会报错&#xff1a; warning: delay defined…...