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://www.mzph.cn/bicheng/5362.shtml

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

相关文章

Linux基础——Linux开发工具(上)_vim

前言&#xff1a;在了解完Linux基本指令和Linux权限后&#xff0c;我们有了足够了能力来学习后面的内容&#xff0c;但是在真正进入Linux之前&#xff0c;我们还得要学会使用Linux中的几个开发工具。而我们主要介绍的是以下几个&#xff1a; yum, vim, gcc / g, gdb, make / ma…

【初识Redis】

初识Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;它提供了一个高性能的键值存储系统&#xff0c;并且支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合等。Redis的特点包括&#xff1a; 内存存储&…

C语言实验-数组、字符串以及指针

一&#xff1a; 求一个NN矩阵主、次对角线上所有元素之和。矩阵输入、矩阵输出、矩阵对角线求和分别用三个子函数实现。&#xff08;N的值由用户从键盘输入&#xff09; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h>void print(int(*arr…

有哪些好用的局域网电脑监控系统软件?

企业员工不好管理&#xff1f;&#xff1f;&#xff1f; 局域网已成为企业日常运营不可或缺的一部分。 然而&#xff0c;随着网络技术的普及&#xff0c;员工在局域网中的不当行为也日益增多&#xff0c;如滥用网络资源、泄露敏感信息、消极怠工等。 为了解决这些问题&#x…

植物大战僵尸杂交版

1.感谢作者潜艇伟伟迷 2.大小大概110M&#xff0c;下载链接在下方 链接&#xff1a;https://pan.baidu.com/s/1Ew6iTg0_d_Ut8N9_18KGLw 提取码&#xff1a;yspa 3.祝大家玩的开心

C++-10

1.C一个程序&#xff0c;实现两个类&#xff0c;分别存放输入的字符串中的数字和字母&#xff0c;并按各自的顺序排列&#xff0c; 类中实现-一个dump函数&#xff0c;调C用后输出类中当前存放的字符串结果。 例如&#xff0c;输入1u4y2a3d,输出:存放字母的类&#xff0c;输出a…

树,二叉树的基本概念介绍,二叉树的性质

目录 树 树的定义 树的相关概念 树的存储结构 树在实际中的运用&#xff08;表示文件系统的目录树结构 &#xff09; 二叉树 二叉树的定义 现实中的二叉树 二叉树的特点 特殊的二叉树 1.斜树 2.满二叉树 3.完全二叉树 二叉树的性质 性质1&#xff1a;二叉树的第…

网络基础(1)网络编程套接字UDP

要完成网络编程首先要理解原IP和目的IP&#xff0c;这在上一节已经说明了。 也就是一台主机要进行通信必须要具有原IP和目的IP地址。 端口号 首先要知道进行网络通信的目的是要将信息从A主机送到B主机吗&#xff1f; 很显然不仅仅是。 例如唐僧要去到西天取真经&#xff0…

源码篇--Nacos服务--中章(8):Nacos服务端感知客户端实例变更-3

文章目录 前言一、客户端实例变更&#xff1a;二、实例变更感知&#xff1a;2.1 实例注册信息通知&#xff1a;2.1.1 接收DistroDataRequest 请求&#xff1a;2.1.2 onReceive 处理请求&#xff1a;2.1.3 processData 处理请求&#xff1a;2.1.4 handlerClientSyncData 处理数据…

k8s集群Grafana精选dashboard页面

文章目录 参考文档 Grafana自选模板推荐模板&#xff1a;13332、13824、14518Grafana默认配置我们选择 Node Exporter/Nodes 的 Dashboard 进去&#xff1a;点击 Kubernetes/Networking/Cluster 进去使用模板查看结果 Grafana接入Prometheus数据Grafana添加监控模板导入 1860_r…

体验用AI写代码

近两年&#xff0c;AI确实迎来了大爆发&#xff0c;2023年也成了AI时代的元年&#xff0c;去年下半年的时候&#xff0c;国内月之暗面出品的Kimi成了新的AI热门&#xff0c;也体验用Kimi修改论文&#xff0c;以及用图片生成代码&#xff0c;代码准确度还是蛮高的。做为SRE&…

使用Python的Tkinter库创建你的第一个桌面应用程序

文章目录 准备工作创建窗口和按钮代码解释运行你的应用程序结论 在本教程中&#xff0c;我们将介绍如何使用Python的Tkinter库创建一个简单的桌面应用程序。我们将会创建一个包含一个按钮的窗口&#xff0c;点击按钮时会在窗口上显示一条消息。 准备工作 首先&#xff0c;确保…

扩展大型视觉-语言模型的视觉词汇:Vary 方法

在人工智能领域&#xff0c;大型视觉-语言模型&#xff08;LVLMs&#xff09;正变得越来越重要&#xff0c;它们能够处理多种视觉和语言任务&#xff0c;如视觉问答&#xff08;VQA&#xff09;、图像字幕生成和光学字符识别&#xff08;OCR&#xff09;。然而&#xff0c;现有…

Docker--compose概述与部署

目录 一、概述 1. Compose简介 1.1 docker compose常用命令 1.2 Compose配置常用字段 2. YAML简介 2.1 YAML支持的数据结构 2.2 YML文件编写注意事项 2.3 Docker Compose文件结构 3. Docker-Compose安装 ​编辑 4.docker Compose撰写nginx 镜像 1. 准备环境 ​编辑…

Zabbix 安装部署说明文档

Zabbix是一个开源的网络监控和管理系统&#xff0c;其架构设计用于提供企业级的监控解决方案。以下是Zabbix的主要组件&#xff1a; 1.Zabbix Server&#xff1a;这是Zabbix系统的核心组件&#xff0c;负责接收Agent程序报告的系统可用性、系统完整性和统计数据。Zabbix Serve…

CSS 06

精灵图 为什么要使用精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度,因此&#xff0c;为了有效地减少服务…

【深度学习】YOLOv5,金属表面的缺陷检测,GC10-DET数据集

目录&#xff1a; 文章目录 数据集数据集转换下载yolov5创建 dataset.yaml训练参数开始训练数据分布训练结果问询、帮助 数据集 数据集地址&#xff1a; https://github.com/lvxiaoming2019/GC10-DET-Metallic-Surface-Defect-Datasets 数据集下载方式&#xff1a; Downlo…

有趣的大模型之我见 | Claude AI

最近我的朋友圈被 Claude 3 严重刷屏。因为它在 Performance Benchmark 和 Vision Capabilities 中的表现荣登第一。 对 Claude AI 的喜欢是从它第二个版本出来。仅从我个人的简单应用场景的体验是&#xff0c;Claude 对于 prompt 的理解度&#xff0c;尤其是对中文的理解度高…

PHP源码_在线艺术字体在线生成转换设计网站源码

最全的字体转换器在线转换、艺术字体在线生成器和字体下载&#xff0c;包括书法字体在线转换、毛笔字在线生成器&#xff0c;更有草书字体、篆体字、连笔字、POP字体转换器等中文和英文字体。 支持自己添加字体&#xff0c;在线艺术字体转换器&#xff0c;织梦内核艺术字体在线…

.NET操作 Access (MSAccess)

注意&#xff1a;新项目推荐 Sqlite &#xff0c;Access需要注意的东西太多了&#xff0c;比如OFFICE版本&#xff0c;是X86还是X64 连接字符串 ProviderMicrosoft.ACE.OleDB.15.0;Data Source"GetCurrentProjectPath"\\test.accdb//不同的office版本 连接字符串有…