再谈HTTP,你还要继续更新不?

简介: 之前的第一篇文章我介绍了关于 HTTP 的一些简单的知识,比如说它的状态码,请求方式,以及 HTTP 的报文,这篇文章我将给大家带来关于 HTTP 版本的那些问题,比如说 1.0 和 1.1 和 2.0.

HTTP 的发展历史

之前的文章直接从内容开始,那这篇文章我就先以历史来开始,HTTP (超文本传输协议),在创建之初就是为了将超文本标记语言(HTML)文档从 web 服务端传送给浏览器的客户端。随着我们网页内容变得复杂,不单单有文字、图片,还有 css ,js 等等渲染,ajax 的出现、移动互联网的高速发展,随着时代的变迁,HTTP 也一直升级优化,丰富自己的功能特性。

HTTP 0.9

0.9 协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9 协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。

这个版本就说图片都不能处理,那不用想,这个版本很快就被抛弃了。

HTTP 1.0

到了 1.0 协议阶段,也就是在 1982 年,TimBerners-Lee 提出了 HTTP 1.0。在此后的不断丰富和发展中,HTTP 1.0 成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。

HTTP 1.1

在 1.0 协议中,双方规定了连接方式和连接类型,这已经极大扩展了 HTTP 的领域,但对于互联网最重要的速度和效率,并没有太多的考虑。毕竟,作为协议的制定者,当时也没有想到 HTTP 协议会有那么快的普及速度。关于 HTTP 1.1 协议的具体内容可以参考 RFC 2616。

HTTP 2.0

HTTP 2.0 的前世是 HTTP 1.0 和 HTTP 1.1。虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼。网络协议新版本并不会马上取代旧版本。实际上,1.0 和 1.1 在之后很长的一段时间内一直并存,这是由于网络基础设施更新缓慢所决定的。

HTTP 1.0 和 HTTP 1.1 的区别

1.长连接:减少了建立和关闭连接的消耗和延迟。

HTTP 1.0 : 规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个 TCP 连接,服务器完成请求处理后立即断开 TCP 连接,服务器不跟踪每个客户也不记录过去的请求。

HTTP 1.1 : 则支持持久连接 Persistent Connection, 并且默认使用 persistent connection。在同一个 TCP 的连接中可以传送多个 HTTP 请求和响应。多个请求和响应可以重叠,多个请求和响应可以同时进行。更加多的请求头和响应头(比如 HTTP 1.0 没有 host 的字段)。

2.缓存处理

HTTP 1.0 :中主要使用 header 里的 If-Modified-Since , Expires 来做为缓存判断的标准。

HTTP 1.1 :则引入了例如 ETag,If-None-Match 等更多可供选择的缓存头来控制缓存策略。

3.Host 头处理:支持 Host 头域,不在以 IP 为请求方标志

HTTP 1.0 :中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名。但随着虚拟主机技术的发展,一台服务器上可以存在多个虚拟主机,共享一个 IP 地址。

HTTP 1.1 :的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request )。

4.错误状态码的增多:1.1 新增了 24 个错误状态响应码,丰富的错误码更加明确各个状态

HTTP 1.1 中新增了 24 个错误状态响应码,如 409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

HTTP 1.1 和 HTTP 2.0 的区别

1.新的传输格式

HTTP 1.1 :使用基于文本格式

HTTP 2.0 :使用二进制格式

2.多路复用

为什么会出现多路复用呢?那么多路复用到底又是什么呢?看懿来给你解析一波。

为什么在 2.0 的时候会出现多路复用,那不用说,肯定 1.1 出问题了,HTTP 1.1 有什么问题呢?重点:效率

HTTP 1.1 虽然解决了多次连接的问题,但是它存在一个致命的缺陷,效率低下。

  1. 串行的文件传输。当请求 a 文件时,b 文件只能等待,等待 a 连接到服务器、服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是 1 秒,那么 a 文件用时为 3 秒,b 文件传输完成用时为 6 秒,依此类推。(注:此项计算有一个前提条件,就是浏览器和服务器是单通道传输)
  2. 连接数过多。我们假设 Apache 设置了最大并发数为 300,因为浏览器限制,浏览器发起的最大请求数为 6,也就是服务器能承载的最高并发为 50,当第 51 个人访问时,就需要等待前面某个请求处理完成。

就这两个问题,1.1 的效率强行的被拉下来了,这时候 2.0 的多路复用就为解决这个问题而出现了。

说多路复用,不的不说一下 1.1 的持久连接,而这个持久连接,就是我们接下来所说的 Keep-Alive 。

Keep-Alive

Keep-Alive 是使用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,而不是为每一个新的请求/应答打开新的连接的方法。我们知道 HTTP 协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接( HTTP 协议为无连接的协议);当使用 Keep-Alive 模式(又称持久连接)时,Keep-Alive 功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。0.png

HTTP 1.0 中默认是关闭的,需要在 HTTP 头加入" Connection: Keep-Alive",才能启用 Keep-Alive ;HTTP 1.1 中默认启用 Keep-Alive ,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用 HTTP 1.1 协议,也就是说默认都会发起 Keep-Alive 的连接请求了,所以是否能完成一个完整的 Keep-Alive 连接就看服务器设置情况。

HTTP 1.1 和 HTTP 2.0 的区别来了,多路复用,什么是多路复用呢?

举个例最简单的例子:

从A地到B地
坐公交2块。打车要20块
为什么坐公交便宜呢
这里所讲的就是“多路复用”的原理。

我们再来看一幅图,这图是网上嫖来的哈,百度上好多,

6.jpg

这也是 HTTP 2.0 的复用连接,虽然依然遵循请求-响应模式,但客户端发送多个请求和服务端给出多个响应的顺序不受限制,这样既避免了"队头堵塞",又能更快获取响应。在复用同一个 TCP 连接时,服务器同时(或先后)收到了 A、B 两个请求,先回应 A 请求,但由于处理过程非常耗时,于是就发送 A 请求已经处理好的部分, 接着回应 B 请求,完成后,再发送 A 请求剩下的部分。HTTP 2.0 长连接可以理解成全双工的协议。

因为 HTTP 2.0 引入二进制数据帧的概念,其中帧对数据进行顺序标识,也就是说,我们传递一个字符串的时候,比如说,我要传递一个,“别说了,我爱你”,HTTP 1.1 是按照一个顺序传输,那么 HTTP 2.0 是怎么传输的,看图:

7.jpg

浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情。

这也就是解决了问题 1,那么怎么解决问题 2 呢?HTTP 2.0 对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一路连接。同样 Apache 的最大连接数为 300,因为有了这个新特性,最大的并发就可以提升到 300,比原来提升了 6 倍!

这就是多路复用,是不是很好理解。

3.头部 header 压缩

HTTP 1.x 的 header 带有大量信息,而且每次都要重复发送,HTTP 2.0 使用 encoder 来减少需要传输的 header 大小,通讯双方各自 cache 一份 header fields 表,既避免了重复 header 的传输,又减小了需要传输的大小。

以上就是我想给大家介绍的关于 HTTP 的版本更迭的那些问题,下篇文章将会给大家介绍 HTTP 是如何使用 TCP 连接的?TCP 连接的时延、瓶颈以及存在的障碍;敬请期待呦。

相关文章
|
API Android开发 图形学
【Unity3D】Android App Bundle(aab)打包上架Google Play介绍
总体说来,Android App Bundle打包有3种方式,每种方式都有成功上架Google Play进行测试通过,因此实用程度还是挺高的。能够理解以下内容的前提是会打apk包,知道如何生成Asset Bundle文件,这块内容可以参考我的上一篇文章。
1074 0
【Unity3D】Android App Bundle(aab)打包上架Google Play介绍
|
安全 Java API
Spring Security实现RBAC权限管理
Spring Security实现RBAC权限管理 一简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security。
6730 0
|
Java
jdk 8 使用okhttp3 实现 http2
使用jdk8 使用okhttp3 实现http2请求
3155 0
jdk 8 使用okhttp3 实现 http2
|
11月前
|
存储 SQL Dubbo
RPC异步化原理
深入RPC,更好使用RPC,须从RPC框架整体性能考虑问题。得知道如何提升RPC框架的性能、稳定性、安全性、吞吐量及如何在分布式下快速定位问题。RPC框架如何压榨单机吞吐量?
286 0
|
12月前
|
SQL JavaScript Dubbo
基于 Apollo 实现配置灰度发布(上)
基于 Apollo 实现配置灰度发布(上)
|
存储 运维 Java
log异步线程间traceId 的传递
分布式项目中,存在多服务调用时,通常都会使用trace id 将多个RPC 调用进行串联起来,方便对整个调用链路进行串联,一旦出现问题方便排查是哪个环节的问题。
1202 0
log异步线程间traceId 的传递
|
Kubernetes Dubbo Cloud Native
Dubbo Mesh - 从服务框架到统一服务控制平台
Dubbo 3 保持了 Dubbo 2 的经典架构,以解决微服务进程间通信为主要职责,通过丰富的服务治理(如地址发现、流量管理等)能力来更好地管控微服务集群;Dubbo3 对原有框架的升级是全面的,体现在核心 Dubbo 特性的几乎每个环节,通过升级实现了稳定性、性能、伸缩性、易用性的全面提升。
Dubbo Mesh - 从服务框架到统一服务控制平台
|
XML 移动开发 前端开发
【SpringBoot WEB 系列】SSE 服务器发送事件详解
SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发中,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用
1636 0
【SpringBoot WEB 系列】SSE 服务器发送事件详解
|
消息中间件 canal 存储
并发编程的业务场景
并发编程的11种业务场景
191 0
并发编程的业务场景
|
负载均衡
RPC-client异步收发核心细节?
通过上篇文章的介绍,知道了要实施微服务,首先要搞定RPC框架,RPC框架分为客户端部分与服务端部分。
1024 0