HTTP 协议的前世今生HTTP 1.0HTTP 1.1 和 HTTP 2.0
Posted 盛夏温暖流年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 协议的前世今生HTTP 1.0HTTP 1.1 和 HTTP 2.0相关的知识,希望对你有一定的参考价值。
本篇博客将从 HTTP 协议的概念出发,分别介绍 HTTP 协议各个版本的特点,以及对 HTTP 协议状态码和 HTTPS 协议进行说明。
首先,我们先来了解下 HTTP 协议的概念。
什么是 HTTP 协议
HTTP 协议 的全称为 HyperText Transfer Protocol(超文本传输协议),是互联网上应用最为广泛的、构建在 TCP 协议之上的应用层协议。它用于客户端与服务器之间的通信,规定了客户端和服务器之间的通信格式,包括请求与响应的格式。
设计 HTTP 最初的目的是为了提供一种发布和接收 html 页面的方法,用于将超文本从 WWW 服务器传输到本地浏览器。也就是说,HTTP 客户端每发起一个请求,都会建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。
而 HTTP 协议发展到今天,共经历了三次版本的变动,分别为 HTTP 1.0、HTTP 1.1 和 HTTP 2.0,现在的最新版本是 HTTP 2.0,接下来,我们一起回顾下 HTTP 协议的发展历程。
HTTP 协议的版本更迭
HTTP 的最早版本诞生在 1991 年,这个版本和现在比起来极其简单,没有 HTTP 头,没有状态码,甚至连版本号也没有,后来它的版本号才被定为 0.9,用来和其他版本的 HTTP 区分。
0.9 版本的协议就是一个交换信息的无序协议,仅限于文字。当 TCP 建立连接之后,服务器向客户端返回 HTML 格式的字符串,发送完毕后,就关闭 TCP 连接。由于没有状态码和错误代码,如果服务器处理的时候发生错误,只会传回一个特殊的包含问题描述信息的 HTML 文件。
可以看出,0.9 版本协议远不能满足日益发展的各种应用的需要,因此在 1996 年,发布了功能更加完善的新版本:HTTP 1.0。
HTTP 1.0
相比 HTTP 0.9,HTTP 1.0 主要有如下特性:
- 请求与响应支持头部;
- 响应对象以响应状态码开始;
- 响应对象不只限于超文本;
- 支持更多类型的客户端向 web 服务器提交数据的方式,包括 GET、HEAD、POST;
- 支持长连接(默认还是使用短连接)、缓存机制以及身份认证;
HTTP 1.0 大大丰富了 HTTP 的传输内容,除了文字,还可以发送图片、视频等,规定了连接方式和连接类型,极大扩展了 HTTP 的领域,为互联网的发展奠定了基础。
但是 HTTP 1.0 也有一个比较大的缺陷,就是浏览器的每次请求都需要与服务器建立 TCP 连接,服务器完成请求处理后立即断开该连接,服务器不会对每个客户进行跟踪,也不记录过去的请求。这个客户端和服务器端频繁建立和关闭连接的过程是相对费时的,会严重影响客户机和服务器的性能,之后的 HTTP 1.1 版本解决了这个问题,可以说 HTTP 1.1 版本是对 HTTP 1.0 版本的完善和改进。
HTTP 1.1
为了克服HTTP 1.0 的性能缺陷,HTTP 1.1 版本开始支持长连接(默认使用带流水线的长连接模式),在一个 TCP 连接上可以传送多个 HTTP 请求和响应,有效减少了建立和关闭连接的消耗和延迟。
除了长连接的优化,HTTP 1.1 版本在 1.0 版本的基础上还新增了以下特性:
错误状态响应码
HTTP 1.1中新增了 24 个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
缓存处理
在HTTP 1.0 中主要使用 header 里的 If-Modified-Since 和 Expires 来做为缓存判断的标准,而 HTTP 1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
带宽优化
HTTP 1.0 中,存在浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却发送了整个对象,并且不支持断点续传功能。而 HTTP 1.1 则允许只请求资源的某个部分,对应的返回码是206(Partial Content),这样就方便开发者进行自由选择,从而可以充分利用带宽和连接。
Host 头处理
HTTP 1.0 中认为每台服务器都绑定唯一的 IP 地址,因此,请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,它们可以共享一个 IP 地址。
因此,HTTP 1.1 中增加了 Host 请求头字段,浏览器可以使用主机名来明确表示要访问服务器上的哪个 WEB 站点,这样一台 WEB 服务器上就可以在同一个 IP 地址和端口号上使用不同的主机名来创建多个虚拟 WEB 站点了。
HTTP 2.0
在并发度方面,HTTP 1.1 可以通过多建立几个 TCP 连接的方式来支持处理更多的并发请求,但是创建 TCP 连接本身也是有开销的,而 HTTP 2.0 对此进行了优化:它使用了多路复用技术,使得同一个连接可以并发处理多个请求,并发请求的数量比 HTTP 1.1大了好几个数量级。
HTTP 2.0 的特点如下:
采用二进制格式
HTTP 1.1 版本的头信息是文本格式,数据体可以是文本或二进制。HTTP 2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”:头信息帧和数据帧。
使用多路复用技术
HTTP 2.0 复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了”队头堵塞”。
报头压缩
HTTP 协议是没有状态的,所以每次请求都必须附上所有信息。而请求的很多头字段都是重复的,每次请求都必须携带,这会浪费很多带宽,也影响速度。
因此 HTTP 2.0 引入了头信息压缩机制:
- 客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号;
- 头信息使用 gzip 或 compress 压缩后再发送;
服务器推送
- HTTP 2.0 允许服务器未经请求,主动向客户端发送资源;
- 通过推送那些服务器认为客户端将会需要的内容到客户端的缓存中,来提高响应效率;
HTTP 协议状态码
状态码 | 英文标识 | 含义 |
---|---|---|
200 | OK | 正常 |
201 | Created | 服务器已经创建了文档,Location 头给出了它的 URL |
202 | Accepted | 已经接受请求,但处理尚未完成 |
300 | Multiple Choices | 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出,如果服务器要提出优先选择,则应该在 Location 应答头指明; |
301 | Moved Permanently | 客户请求的文档在其他地方,被永久性替代 |
302 | Moved Temporatily | 新的 URL 被视为临时性的替代,而不是永久性的 |
304 | Not Modified | 服务器通知客户端,缓冲的文档未进行修改,可以继续使用 |
400 | Bad Request | 请求出现语法错误 |
401 | Unauthorized | 客户试图未经授权访问受密码保护的页面 |
403 | Forbidden | 资源不可用。服务器理解客户的请求,但拒绝处理,通常由于服务器上文件或目录的权限设置导致。 |
404 | Not Found | 无法找到指定位置的资源 |
500 | Internal Server Error | 服务器遇到了意料不到的情况,不能完成客户的请求 |
502 | Bad Gateway | 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答 |
503 | Service Unavailable | 服务器由于维护或者负载过重未能应答 |
状态码 | 英文标识 | 含义 |
---|---|---|
100 | Continue | 初始的请求已经接受,客户应当继续发送请求的其余部分。 |
101 | Switching Protocols | 服务器将遵从客户的请求转换到另外一种协议 |
203 | Non-Authoritative Information | 文档已经正常地返回,但一些应答头可能不正确 |
204 | No Content | 没有新文档,浏览器应该继续显示原来的文档 |
205 | Reset Content | 没有新的内容,但浏览器应该重置它所显示的内容,用来强制浏览器清除表单输入内容 |
206 | Partial Content | 客户发送了一个带有 Range 头的 GET 请求,服务器完成了它 |
303 | See Other | 类似于 301/302,不同之处在于,如果原来的请求是 POST,Location 头指定的重定向目标文档应该通过 GET 提取 |
305 | Use Proxy | 客户请求的文档应该通过 Location 头所指明的代理服务器提取 |
307 | Temporary Redirect | 当出现303应答时,浏览器可以跟随重定向的GET和POST请求; 如果是307应答,则浏览器只能跟随对GET请求的重定向。 |
405 | Method Not Allowed | 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用 |
406 | Not Acceptable | 指定的资源已经找到,但它的 MIME 类型和浏览器在 Accept 头中所指定的不兼容 |
407 | Proxy Authentication Required | 表示客户必须先经过代理服务器的授权 |
408 | Request Timeout | 在服务器许可的等待时间内,客户端一直没有发出任何请求,可以在以后重复同一请求 |
409 | Conflict | 由于请求和资源的当前状态相冲突,因此请求不能成功 |
410 | Gone | 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址 |
411 | Length Required | 服务器不能处理请求,除非客户发送一个 Content-Length 头 |
412 | Precondition Failed | 请求头中指定的一些前提条件失败 |
413 | Request Entity Too Large | 目标文档的大小超过服务器当前愿意处理的大小 |
414 | Request URI Too Long | URI 太长 |
416 | Requested Range Not Satisfiable | 服务器不能满足客户在请求中指定的 Range 头 |
504 | Gateway Timeout | 表示不能及时地从远程服务器获得应答 |
505 | HTTP Version Not Supported | 服务器不支持请求中所指明的 HTTP |
以上就是 HTTP 协议的状态码,最后,我们再来了解下 HTTPS 协议。
HTTPS 协议
HTTPS 协议是以安全为目标的 HTTP 通道,简单讲就是安全版的 HTTP,即在 HTTP 的基础上加入 了SSL 层,HTTPS 的安全基础是 SSL。
- HTTPS 协议需要到 CA 申请证书;
- HTTP 协议运行在 TCP 之上,所有传输的内容都是明文的,而 HTTPS 运行在 SSL/TLS 之上,传输内容都是经过加密的;
- HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是443;
- HTTPS 可以有效的防止运营商劫持;
本篇博客参考了以下内容,非常感谢:
(纯干货)HTTP/1.0/1.1/2.0的区别以及http和https的区别 - 码农教程
以上是关于HTTP 协议的前世今生HTTP 1.0HTTP 1.1 和 HTTP 2.0的主要内容,如果未能解决你的问题,请参考以下文章