HTTP协议的发展过程

前言

HTTP协议是一种用于在网络上传输信息的应用层协议,它为万维网的运作提供了基础。
最早的版本是HTTP/0.9,它是HTTP协议的第一个版本,诞生于1991年,其设计初衷是为了在计算机之间传输简单的超文本文档,即HTML。
在HTTP2之前,HTTP一直都是基于文本的协议,足够的简单、良好的可读性是HTTP协议能取得如此成功的重要原因之一。
然而,随着互联网的发展和网页内容的复杂性增加,基于文本的HTTP协议逐渐暴露出一些性能上的限制。为了解决这些问题,才有了HTTP2。

HTTP协议

版本发布年份主要特点
HTTP 0.91991年最初版本,用于传输超文本(HTML)文档
HTTP 1.01996年支持多种类型的数据和HTTP头部
HTTP 1.11997年长连接、管道化、缓存机制,提高了性能和效率
HTTP/22015年二进制协议、多路复用、头部压缩、服务器推送、流量控制

HTTP/0.9

HTTP/0.9是最早的HTTP协议版本,于1991年发布。它非常简单,典型的请求-响应模型,没有定义任何HTTP头部信息,只支持传输HTML。它的主要特点如下:

  • 只支持GET
  • 无HTTP头部
  • 纯文本协议

请求示例:

GET /index.html

响应示例:

<html><body>content</body>
</html>

HTTP/1.0

HTTP/1.0是HTTP协议的一个重要版本,于1996年发布。
HTTP/1.0相对于HTTP/0.9,增加了以下内容和特性:

  1. 新增POST、HEAD请求方法
  2. 引入请求头信息
  3. 引入响应状态码,如:200表示成功

请求示例:

GET /path/file.html HTTP/1.0
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0

响应示例:

HTTP/1.0 200 OK
Date: Fri, 08 Jul 2023 18:30:00 GMT
Server: Apache/2.4.7 (Ubuntu)
Content-Length: 256
Content-Type: text/html<html>
<body>...
</body>
</html>

HTTP/1.1

HTTP/1.1相对于HTTP/1.0,增加了以下内容和特性:

  1. 持久连接:HTTP/1.1默认使用持久连接,即在单个TCP连接上可以发送多个请求和获得多个响应。这样可以减少建立和关闭连接的开销,提高性能。
  2. 管道化:在一个连接上可以同时发送多个请求,而无需等待每个请求的响应。服务器也可以按照请求的顺序回复响应,进一步提高了性能。
  3. 分块传输编码:允许服务器将响应分成多个部分进行传输,这对于传输大文件或者流式数据非常有用。
  4. Host头部:允许在一个物理服务器上托管多个域名或多个虚拟主机,服务器根据不同的 Host 头部字段来选择不同的网站或虚拟主机进行请求处理。

HTTP2

为什么命名不是HTTP/1.2?因为HTTP2协议关于数据传输的部分改动很大,从一个基于文本的协议升级到了二进制协议,属于是大版本的升级。
相较于HTTP/1.1,HTTP2的特点是:

  • 二进制分帧消息:从一个文本协议升级到了二进制协议,HTTP2把消息切分成多个二进制帧Frame发送,为了区分不同的消息,帧有很多类型,例如传输请求头的HEADERS帧,传输消息体的DATA帧等。
  • 多路复用:HTTP2在单个连接上可以同时开辟多个逻辑上的流Stream,消息是基于Stream发送的,意味着请求和响应可以并发处理。
  • 头部压缩:之前是消息体可以压缩,在HTTP2上,消息头也支持压缩了。
  • 服务端推送:不止是客户端请求服务端,现在服务端也可以主动推送数据给客户端了。
  • 流量控制:HTTP1因为在单个连接上,请求-响应都是串行的,因此直接依赖于底层TCP的流控就好了。HTTP2有了多路复用,单个连接上可以同时有多个Stream,此时必须要实现更精细化的流量控制。

HTTP2会把消息拆分成多个Frame发送,这些Frame是基于二进制传输的,无法直接拆看,必须使用对应的工具或三方库来处理这些Frame。
关于HTTP2的各种Frame的格式,以及其它介绍,可以查看这篇文档:https://httpwg.org/specs/rfc9113.html#FrameTypes

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

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

相关文章

在Java中对XML的简单应用

XML 数据传输格式1 XML 概述1.1 什么是 XML1.2 XML 与 HTML 的主要差异1.3 XML 不是对 HTML 的替代 2 XML 语法2.1 基本语法2.2 快速入门2.3 组成部分2.3.1 文档声明格式属性 2.3.2 指令&#xff08;了解&#xff09;&#xff1a;结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…

【Linux】Linux中获取UUID的方法

1、从mmc块设备获取 在Linux下,获取MMC的CID(Card Identification,识别ID) cat /sys/block/mmcblk0/device/cidMMC CID组成 MID: [127:120] —— 8bit(1Byte)Manufacturer ID,由MMCA分配,比如Sandisk为0x02,Kingston为0x37,Samsung为0x15。OID: [119:104] —— 16b…

windows程序基础

一、windows程序基础 1. Windows程序的特点 1&#xff09;用户界面统一、友好 2&#xff09;支持多任务:允许用户同时运行多个应用程序(窗口) 3&#xff09;独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#…

什么是视频的编码和解码

这段描述中&#xff0c;视频解码能力和视频编码能力指的是不同的处理过程。视频解码是将压缩过的视频数据解开并还原为可播放的视频流&#xff0c;而视频编码是将原始视频数据压缩成更小的尺寸&#xff0c;以减少存储空间和传输带宽。在这个上下文中&#xff0c;解码能力和编码…

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形&#xff0c;可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

Android:换肤框架Android-Skin-Support

gihub地址&#xff1a;https://github.com/ximsfei/Android-skin-support 样例&#xff1a; 默认&#xff1a; 更换后&#xff1a; 一、引入依赖&#xff1a; // -- 换肤依赖implementation skin.support:skin-support:4.0.5// skin-supportimplementation skin.support:ski…

Rust语法:变量,函数,控制流,struct

文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop & whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量 可变与不可变变量 Rust中使用let来声明变量&#xff0c;但是let声明的是不可变变量&#x…

Golang自定义类型与类型别名

type myInt int32 与 type myInt int32&#xff0c;概念并不相同 自定义类型&#xff1a;type myInt int32 通过这种方式定义的类型是一个全新的类型&#xff0c;这个新类型与int32有相同的底层结构&#xff0c;但是却与int32类型不兼容。 type myInt int32var a int32 5 var…

双色球彩票系统---(java实现)

双色球彩票系统&#xff1a;需求&#xff1a;投注号码由6个红色号码和1个蓝色球号码组成。红色球号码从1-33中选择&#xff0c;蓝色球号码从1-16当中选择 * 红 蓝 * 一等奖 6 1 * 二等奖 6 0 * 三等奖 5 1 * 四等奖 5 0 * 4 1 * 五等奖 4 0 * …

Blazor简单教程(1.1):Razor基础语法

文章目录 前言基本文件配置引入Layout组件 语法介绍pagecodeRazor 语法[ 显式表达和隐式表达](https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/razor?viewaspnetcore-7.0#explicit-razor-expressions) 绑定简单绑定双向绑定带参数的函数绑定 依赖注入 前言 Blazor…

synchronized使用

目录 问题描述 1 锁方法 2 锁代码块 3 锁某个类 4 静态方法上的synchronized 当我们处理多线程处理同步问题的时候就会用到synchronized这个关键字&#xff0c;下面介绍下synchronized的四种用法。 问题描述 介绍之前我们先来看下&#xff0c;在java 多线程中 如果没有线…

leetcode1. 两数之和

题目&#xff1a;leetcode1. 两数之和 描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中…

QT:UI控件(按设计师界面导航界面排序)

基础部分 创建新项目&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog QMainWindow继承自QWidget&#xff0c;多了菜单栏; QDialog继承自QWidget&#xff0c;多了对话框 QMainWindow 菜单栏和工具栏&#xff1a; Bar: 菜单栏&#xff1a;QMenuBar&#xff0…

A Survey for In-context Learning

A Survey for In-context Learning 摘要&#xff1a; 随着大语言模型(LLMs)能力的增长&#xff0c;上下文学习(ICL)已经成为一个NLP新的范式&#xff0c;因为LLMs仅基于几个训练样本让内容本身增强。现在已经成为一个新的趋势去探索ICL来评价和extrapolate LLMs的能力。在这篇…

微服务06-分布式事务解决方案Seata

1、Seata 概述 Seata事务管理中有三个重要的角色: TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resourc…

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术&#xff0c;由基础入门开始到应用实战&#xff0c;适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战&#xff0c;包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务&#xff0c;来处理高并发的问题。还讲…

ttf-dejavu fontconfig字体

ttf-dejavu fontconfig是验证码&#xff0c;pdf&#xff0c;excel时需要用到的字体 编辑dockerfile&#xff0c;先切换国内镜像源&#xff0c;默认alpinelinux是国外源&#xff0c;下载包会很慢 vim Dockerfile FROM alpine:latest RUN sed -i s/dl-cdn.alpinelinux.org/mirr…

【创建型设计模式】C#设计模式之原型模式

原型模式是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而无需通过实例化的方式。它允许我们使用已经存在的对象作为蓝本&#xff0c;从而创建新的对象&#xff0c;这样可以避免重复初始化相似的对象&#xff0c;提高了对象的创建效率。 现在给…

Sentinel

1、熔断降级限流 熔断 A服务调用B服务的某个功能&#xff0c;由于网络不稳定、B服务卡机等问题&#xff0c;导致功能时间超长。如果这样子的次数太多&#xff0c;我们就可以直接将B断路&#xff08;A不再请求B接口&#xff09;&#xff0c;凡是调用B服务的直接返回降级数据&a…

13-数据结构-串以及KMP算法,next数组

串 目录 串 一、串&#xff1a; 二、串的存储结构&#xff1a; 三、模式匹配 1.简单模式匹配&#xff08;BF算法&#xff09; 2.KMP算法 2.1-next&#xff08;j&#xff09;数组手工求解 2.2-nextval&#xff08;j&#xff09;数组手工求解 一、串&#xff1a; 内容受…