http的发展历史,各版本的差异点,以及和https的区别

server/2024/9/24 7:22:59/

### HTTP的发展历史及各版本的差异点

HTTP/0.9

- **发布时间**:1991年
- **特点**:
  - 最初的HTTP协议版本,非常简单。
  - 只支持GET方法,不支持请求头和响应头。
  - 响应仅为纯文本,无法传输图片、音频等多媒体资源。
  - 通过TCP连接请求一个资源后立即关闭连接。

 HTTP/1.0

- **发布时间**:1996年(RFC 1945)
- **特点**:
  - 支持更多的请求方法,如POST、HEAD等。
  - 引入了HTTP头部,支持传输更多的元数据。
  - 支持多种内容类型,通过`Content-Type`头部进行标识。
  - 每次请求/响应都会建立和关闭一个TCP连接,效率较低。

 HTTP/1.1

- **发布时间**:1997年(RFC 2068),1999年更新(RFC 2616),2014年进一步更新(RFC 7230-7235)
- **特点**:
  - 连接复用(Persistent Connection):默认使用持久连接(Keep-Alive),在同一个TCP连接上可以进行多个请求和响应,减少了连接的开销。
  - 支持管道化(Pipelining):允许在一个连接中同时发送多个请求,尽管响应仍然按顺序返回。
  - 增加了许多新的头部字段,如`Host`、`If-Modified-Since`、`Range`等,支持更丰富的功能。
  - 增强了缓存机制,支持分块传输编码(Chunked Transfer Encoding),可以逐步传输响应内容。
  - 支持内容协商(Content Negotiation),客户端和服务器可以就内容的格式进行协商。

连接复用(Persistent Connections)

在HTTP/1.0中,每次请求/响应都需要建立一个TCP连接,这种方式效率较低。在HTTP/1.1中,引入了连接复用(也叫持久连接)的概念,默认启用了持久连接,即一个TCP连接可以用于多个请求和响应,不需要每次都重新建立和关闭连接。持久连接通过在头部字段中加入Connection: keep-alive来实现。

意义
  • 减少延迟:复用连接减少了频繁建立和关闭TCP连接的开销,从而降低了延迟。
  • 节省资源:减少了服务器和客户端资源的消耗,因为建立和关闭连接需要额外的计算资源和网络资源。

管道化(Pipelining)

概念

管道化是HTTP/1.1的一个特性,允许客户端在同一个TCP连接上发送多个HTTP请求,而不必等待前一个请求的响应到达后再发送下一个请求。

实现和问题
  • 实现:客户端可以在第一个请求的响应返回之前,继续发送后续的请求。服务器按照请求的顺序依次处理并返回响应。
  • 问题:虽然管道化可以提高效率,但如果前面的请求处理时间较长,后面的请求会被阻塞,出现队头阻塞(Head-of-line blocking)问题。由于这个原因,管道化并未得到广泛使用和支持。

HTTP/2

- **发布时间**:2015年(RFC 7540)
- **特点**:
  - 二进制分帧层:HTTP/2将HTTP消息分割成更小的帧,并在传输层进行二进制编码,而不是HTTP/1.x的纯文本格式。
  - 多路复用(Multiplexing):在一个TCP连接上同时发送多个请求和响应,消除了HTTP/1.x中的队头阻塞问题。
  - 头部压缩(Header Compression):使用HPACK算法对头部进行压缩,减少了头部数据的传输开销。
  - 服务器推送(Server Push):服务器可以在客户端请求之前推送资源,从而提高性能。
  - 流量优先级(Stream Prioritization):客户端可以为请求设置优先级,服务器可以根据优先级进行资源分配。

HTTP/2中的多路复用(Multiplexing)

概念

多路复用是HTTP/2中的一个核心特性,它通过在一个TCP连接上同时处理多个请求和响应,彻底解决了HTTP/1.1中的队头阻塞问题。

实现
  • 二进制分帧:HTTP/2将HTTP消息分割成更小的帧(Frame),并在传输层进行二进制编码,而不是HTTP/1.x的纯文本格式。
  • :每个请求/响应对被分配一个唯一的流(Stream ID)。多个流可以在同一个TCP连接上并行传输,不需要按顺序处理。
  • 优先级:每个流可以有优先级,服务器可以根据优先级分配资源。
优点
  • 消除队头阻塞:多路复用允许在同一个连接上并行处理多个请求和响应,不受前一个请求的处理时间影响。
  • 提高传输效率:二进制分帧和头部压缩(HPACK算法)进一步减少了数据传输的开销。

http1.1里管道化与多路复用的区别

  1. 顺序处理 vs 并行处理

    • 管道化:在同一个TCP连接上顺序发送多个请求,但响应也必须按顺序返回。如果某个请求处理时间长,后续请求会被阻塞。
    • 多路复用:在同一个TCP连接上并行处理多个请求和响应,不受顺序影响,消除了队头阻塞问题。
  2. 实现方式

    • 管道化:基于HTTP/1.1的文本协议,要求客户端按照顺序发送请求,服务器按顺序返回响应。
    • 多路复用:基于HTTP/2的二进制协议,通过流ID标识请求和响应,允许在一个连接上同时处理多个流。
  3. 性能

    • 管道化:提升有限,受队头阻塞影响较大。
    • 多路复用:显著提升,消除队头阻塞,并且通过二进制分帧和头部压缩提高了传输效率。

综述

  • 连接复用:HTTP/1.1中引入,通过持久连接减少频繁建立和关闭TCP连接的开销。
  • 管道化:HTTP/1.1中的特性,允许顺序发送多个请求,但受队头阻塞影响。
  • 多路复用:HTTP/2中的核心特性,通过二进制分帧和流的概念,在同一个TCP连接上并行处理多个请求和响应,彻底解决队头阻塞问题,提高了传输效率和性能。

 

HTTP/3

- **发布时间**:2020年(草案阶段,IETF QUIC工作组)
- **特点**:
  - 基于QUIC协议:HTTP/3运行在QUIC协议之上,而不是传统的TCP协议。QUIC是一种基于UDP的传输层协议,提供更快的连接建立和恢复。
  - 改进的多路复用:在HTTP/2的多路复用基础上进一步优化,消除了TCP中的队头阻塞问题。
  - 更低的延迟:通过更快速的握手过程和连接迁移功能,提高了传输效率和可靠性。
  - 集成了TLS 1.3:内置加密,简化了安全连接的建立过程。

HTTP和HTTPS的区别

协议层次


  - **HTTP**:运行在TCP协议之上,默认端口是80
  - **HTTPS**:运行在SSL/TLS协议之上,再在其上运行HTTP,默认端口是443

安全性


  - **HTTP**:数据以明文形式传输,存在被窃听、篡改和伪装的风险。
  - **HTTPS**:通过SSL/TLS对数据进行加密传输,确保数据的保密性、完整性和真实性。

性能


  - **HTTP**:不进行加密和解密处理,性能开销较小。
  - **HTTPS**:由于加密和解密操作,性能开销较大,但通过硬件加速和协议优化,可以减小性能影响。

使用场景


  - **HTTP**:适用于对安全性要求不高的场景,如公共信息的查询、静态资源的加载等。
  - **HTTPS**:适用于对安全性要求较高的场景,如登录认证、在线支付、敏感数据传输等。

综述

- **HTTP/0.9**到**HTTP/3**:随着版本的升级,HTTP协议在功能、性能、安全性等方面得到了显著提升。
- **HTTPS**:在HTTP的基础上通过SSL/TLS提供了安全的通信保障,是现代互联网中广泛使用的安全通信协议。


http://www.ppmy.cn/server/99768.html

相关文章

llama factory 训练 TensorBoard 可视化

首先需要在 yaml 里设置两个参数: output_dir: /home/wangguisen/projects/LLaMA-Factory/weights/tensbox_demoreport_to: tensorboard logging_dir: /home/wangguisen/projects/LLaMA-Factory/weights/tensbox_demo/runs然后开始训练,在你的输出目录下…

LCM红外小目标检测

根据站内的matlab代码修改成python版本。 import numpy as np import matplotlib.pyplot as plt import cv2 from pylab import mpl# 设置中文显示字体 mpl.rcParams["font.sans-serif"] ["SimHei"]def LCM_computation(patch_LCM_in):row, col patch_L…

nodejs/node-sass/sass-loader三者版本对应关系(已解决)

基本前提:了解版本对应关系 示例: 我的nodejs:v14.21.3, 则package.json: "node-sass": "^4.14.1", "sass-loader": "^8.0.0",扩展: 查看node历史版本: Node.js…

java SPI实现类中注入spring bean对象

在项目中,用到了SPI来扩展一些功能,发现很多实现类中用到了bean对象,并且都是通过getBean的方式每次都去拿,感觉不是很方便,而且速度也没有直接使用对象快。 正好安排的工作就是优化那一块的代码,所以就改造…

统计回归与Matlab软件实现上(一元多元线性回归模型)

引言 关于数学建模的基本方法 机理驱动 由于客观事物内部规律的复杂及人们认识程度的限制,无法得到内在因果关系,建立合乎机理规律的数学模型数据驱动 直接从数据出发,找到隐含在数据背后的最佳模型,是数学模型建立的另一大思路…

HTTP的场景实践

HTTP的场景实践:任选一个浏览器,对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存: Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存: ETag用于标识资源的唯一标识符,…

Python套接字综合应用(UDP篇)

Python套接字综合应用(UDP篇) 1、 主要功能 UDP客户端实现UDP服务端实现输出字体颜色控制响应捕获键盘CtrlC信号套接字异常捕获及处理通信报文16进制格式化输出 2、 Python UDP套接字应用 Windows程序在WinServer2022上验证运行,Linux程序在银河麒麟V10上验证运…

PythonStudio 控件使用常用方式(十四)TCheckListBox

PythonStudio是一个极强的开发Python的IDE工具,它使用的是Delphi的控件,常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点,也作为PythonStudio的参考。 从1.2.1版开始,Python…