HTTP 的前世此生:一次性搞懂 HTTP、HTTPS、SPDY、HTTP2

做为互联网通讯协议的一员老将,HTTP 协议走到今天已经经历了三次版本的变更,如今最新的版本是 HTTP2.0,相信你们早已耳熟能详。今天就给你们好好介绍一下 HTTP 的前世此生。html

HTTP/0.9

HTTP 的最先版本诞生在 1991 年,这个最先版本和如今比起来极其简单,没有 HTTP 头,没有状态码,甚至版本号也没有,后来它的版本号才被定为 0.9 来和其余版本的 HTTP 区分。HTTP/0.9 只支持一种方法—— Get,请求只有一行。前端

GET /hello.html
复制代码

响应也是很是简单的,只包含 html 文档自己。算法

<HTML>
Hello world
</HTML>
复制代码

当 TCP 创建链接以后,服务器向客户端返回 HTML 格式的字符串。发送完毕后,就关闭 TCP 链接。因为没有状态码和错误代码,若是服务器处理的时候发生错误,只会传回一个特殊的包含问题描述信息的 HTML 文件。这就是最先的 HTTP/0.9 版本。数据库

HTTP/1.0

1996 年,HTTP/1.0 版本发布,大大丰富了 HTTP 的传输内容,除了文字,还能够发送图片、视频等,这为互联网的发展奠基了基础。相比 HTTP/0.9,HTTP/1.0 主要有以下特性:浏览器

  • 请求与响应支持 HTTP 头,增长了状态码,响应对象的一开始是一个响应状态行
  • 协议版本信息须要随着请求一块儿发送,支持 HEAD,POST 方法
  • 支持传输 HTML 文件之外其余类型的内容 一个典型的 HTTP/1.0 的请求像这样:
GET /hello.html HTTP/1.0
User-Agent:NCSA_Mosaic/2.0(Windows3.1)

200 OK
Date: Tue, 15 Nov 1996 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html

<HTML>
一个包含图片的页面
<IMGSRC="/smile.gif">
</HTML>
复制代码

HTTP/1.1

在 HTTP/1.0 发布几个月后,HTTP/1.1 就发布了。HTTP/1.1 更多的是做为对 HTTP/1.0 的完善,在 HTTP1.1 中,主要具备以下改进:缓存

  • 能够复用链接
  • 增长 pipeline:HTTP 管线化是将多个 HTTP 请求整批提交的技术,而在传送过程当中不需先等待服务端的回应。管线化机制须经过永久链接(persistent connection)完成。浏览器将HTTP请求大批提交可大幅缩短页面的加载时间,特别是在传输延迟(lag/latency)较高的状况下。有一点须要注意的是,只有幂等的请求可使用 pipeline,如 GET,HEAD 方法。
  • chunked 编码传输:该编码将实体分块传送并逐块标明长度,直到长度为 0 块表示传输结束, 这在实体长度未知时特别有用(好比由数据库动态产生的数据)
  • 引入更多缓存控制机制:如 etag,cache-control
  • 引入内容协商机制,包括语言,编码,类型等,并容许客户端和服务器之间约定以最合适的内容进行交换
  • 请求消息和响应消息都支持 Host 头域:在 HTTP1.0 中认为每台服务器都绑定一个惟一的 IP 地址,所以,请求消息中的URL并无传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上能够存在多个虚拟主机(Multi-homed Web Servers),而且它们共享一个 IP 地址。所以,Host 头的引入就颇有必要了。
  • 新增了 OPTIONS,PUT, DELETE, TRACE, CONNECT 方法 虽然 HTTP/1.1 已经优化了不少点,做为一个目前使用最普遍的协议版本,已经可以知足不少网络需求,可是随着网页变得愈来愈复杂,甚至演变成为独立的应用,HTTP/1.1 逐渐暴露出了一些问题:
  • 在传输数据时,每次都要从新创建链接,对移动端特别不友好
  • 传输内容是明文,不够安全
  • header 内容过大,每次请求 header 变化不大,形成浪费
  • keep-alive 给服务端带来性能压力 为了解决这些问题,HTTPS 和 SPDY 应运而生。

HTTPS

HTTPS 是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,所以加密的详细内容就须要 SSL。 安全

HTTPS
HTTPS 协议的主要做用能够分为两种:一种是创建一个信息安全通道,来保证数据传输的安全;另外一种就是确认网站的真实性。 HTTPS 和 HTTP 的区别主要以下:

  • HTTPS 协议使用 ca 申请证书,因为免费证书较少,须要必定费用。
  • HTTP 是明文传输,HTTPS 则是具备安全性的 SSL 加密传输协议。
  • HTTP 和 HTTPS使用的是彻底不一样的链接方式,用的端口也不同,前者是 80,后者是 443。

SPDY

其实 SPDY 并非新的一种协议,而是在 HTTP 以前作了一层会话层。 bash

SPDY
在 2010 年到 2015 年,谷歌经过实践一个实验性的 SPDY 协议,证实了一个在客户端和服务器端交换数据的另类方式。其收集了浏览器和服务器端的开发者的焦点问题,明确了响应数量的增长和解决复杂的数据传输。在启动 SPDY 这个项目时预设的目标是:

  • 页面加载时间 (PLT) 减小 50%。
  • 无需网站做者修改任何内容。
  • 将部署复杂性降至最低,无需变动网络基础设施。
  • 与开源社区合做开发这个新协议。
  • 收集真实性能数据,验证这个实验性协议是否有效。 为了达到下降目标,减小页面加载时间的目标,SPDY 引入了一个新的二进制分帧数据层,以实现多向请求和响应、优先次序、最小化及消除没必要要的网络延迟,目的是更有效地利用底层 TCP 链接。

HTTP/2.0

时间来到 2015 年,HTTP/2.0 问世。先来介绍一下 HTTP/2.0 的特色吧:服务器

  • 使用二进制分帧层:在应用层与传输层之间增长一个二进制分帧层,以此达到在不改动 HTTP 的语义,HTTP 方法、状态码、URI 及首部字段的状况下,突破HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。在二进制分帧层上,HTTP2.0 会将全部传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中 HTTP1.x 的首部信息会被封装到 Headers 帧,而咱们的 request body 则封装到 Data 帧里面。
    二进制分帧
  • 多路复用:对于 HTTP/1.x,即便开启了长链接,请求的发送也是串行发送的,在带宽足够的状况下,对带宽的利用率不够,HTTP/2.0 采用了多路复用的方式,能够并行发送多个请求,提升对带宽的利用率。
    多路复用
  • 数据流优先级:因为请求能够并发发送了,那么若是出现了浏览器在等待关键的 CSS 或者 JS 文件完成对页面的渲染时,服务器却在专一的发送图片资源的状况怎么办呢?HTTP/2.0 对数据流能够设置优先值,这个优先值决定了客户端和服务端处理不一样的流采用不一样的优先级策略。
  • 服务端推送:在 HTTP/2.0 中,服务器能够向客户发送请求以外的内容,好比正在请求一个页面时,服务器会把页面相关的 logo,CSS 等文件直接推送到客户端,而不会等到请求来的时候再发送,由于服务器认为客户端会用到这些东西。这至关于在一个 HTML 文档内集合了全部的资源。
  • 头部压缩:使用首部表来跟踪和存储以前发送的键值对,对于相同的内容,不会再每次请求和响应时发送。
    头部压缩
    能够看到 HTTP/2.0 的新特色和 SPDY 很类似,其实 HTTP/2.0 原本就是基于 SPDY 设计的,能够说是 SPDY 的升级版。 可是 HTTP/2.0 仍有和 SPDY 不一样的地方,主要有以下两点:
  • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS。
  • HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE。

文 / Xss微信

编 / 荧声

若是你对 HTTP 的沿袭感兴趣,想看到更细致的介绍,欢迎阅读咱们此前的文章:

从过去到将来:关于 HTTP2 的研究

此外,咱们正在进行限时有奖读者调查,欢迎参加:

[读者调查] 创宇前端期待听到你的声音


本文已由做者受权发布,版权属于创宇前端。欢迎注明出处转载本文。本文连接:knownsec-fed.com/2018-09-11-…

想要订阅更多来自知道创宇开发一线的分享,请搜索关注咱们的微信公众号:创宇前端(KnownsecFED)。欢迎留言讨论,咱们会尽量回复。

感谢您的阅读。

相关文章
相关标签/搜索