成为web后台开发已有一段时间,在同事的建议下,打算趁机系统的学习一下htpp协议。
本人小萌新一谋,在此记录自己的学习历程,本文主要介绍HTTP协议的历史演变过程,以求能够更好的理解其设计思路。
HTTP是什么?
首先,我们先来看一下,HTTP到底是什么?
不假思索的,我们就能说出:“HTTP 就是超文本传输协议 即 HyperText Transfer Protocol” 这个里面有三个关键词 超文本 传输
协议 ,所以本质上 HTTP 还是一种Protocol。
HTTP的诞生,HTTP 0.9版本
1989年,在 互联网上构建超链接文档系统的构想 首次被 TimBerners_Lee发表于他的论文当中,论文确立了三项关键技术。
- URL: 统一资源标识符,作为互联网上资源的唯一身份;
- HTML: 超文本标记语言,描述超文本文档;
- HTTP: 超文档传输协议,用于传输超文本;
1991年正式发布HTTP的0.9版本,由于当时互联网的环境还处于发展最初期的时候,计算机 不仅处理能力, 存储量小, 网速也是相当的慢,所以在这样的背景下,0.9版本的HTPP协议也是极其简单, 只包含了一个命令 GET。
GET /index.html
上面命令表示,TCP连接建立后,客户端向服务器请求网页。
此时,服务器也只能回应HTML格式的字符串,不能回应其他的格式。
并且,响应结束后,连接立即关闭。
虽说,0.9版本的HTTP 功能单一,但和当时的简陋互联网环境相比,0.9版本的HTTP的诞生已经足够支持人们在互联网上获取文件,传递信息。
随着互联网环境的优化,各色浏览器、文件格式的诞生,单一的HTTP协议已经不能够满足人们在互联网传递信息的需求。比如,JPEG的图像格式,MP3的音乐格式,均是在那个时期诞生。
HTPP 的进阶 , HTTP 1.0 版本
终于,1996年HTTP的1.0版本正式发布。相比于0.9版本,1.0版本的HTTP发生了哪些变化呢?
- 增加了HEAD POST 等新方法;
- 增加了响应状态码,用来标记可能出错的原因;
- 引入协议版本号的概念;
- 引入HTTP Header的概念,用来描述一些元数据;
- 传输的数据不再仅限于文本;
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
第一行为请求命令 后跟版本号
新增的头方法,用于描述客户端的一些情况
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
回应的格式: 头信息 + 一个空行(\r\n) + 数据
第一行是 协议版本 + 状态码(status code) + 状态描述
Content-Type:由于1.0版规定,头信息必须是 ASCII 码,后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式。
HTTP 的微调, HTTP 1.1版本
1997年, HTTP 1.1版本发布。而该版本至今仍是使用最多的HTTP版本。那么相比于1.0版本的HTTP, 1.1又做了哪些改进呢?
- 引入持久连接(persistent connection;
- 增加缓存管理和控制;
- 增加PUT DELETE等新方法;
- 允许响应数据分块,利于传输大文件;
- 强制要求Host头,让互联网主机托管成为可能;
HTTP 的性能之战, HTTP 2版本
2015年,HTTP/2 发布, http2 基于 Google 的 SPDY 协议,更加注重于性能的改善。
主要特点有:
- 二进制协议,不再是纯文本;
- 可发起多个请求,废弃了 1.1 里的管道;;
- 使用了专用的算法压缩头部,减少了数据的传输量;;
- 允许服务器主动向客户端推送数据;
- 要求加密通信,增强了安全性;
HTTP 的未来,HTTP 3版本
2018年,互联网标准化组织 IETF 提议将 ”HTTP over QUIC”更名为 “HTTP/3” 已经获得批准, HTTP/3 已经正式进入标准化制定阶段。
经过这一系列的改进,我相信HTTP/3值得期待,那么你呢?
到这里,你是不是已经觉得我们今天的历史课已经结束了呢?哈哈,并不是,我想说的是,你有没想过, HTTP 从最初的 HTTP/0.9 到 如今 的HTTP/3 ,到底是谁驱动这他的发展呢? 是google吗? 是标准协会吗? 是你,是我还是他呢?
总结
-
HTTP/0.9 版本的诞生,实现互联网文本文件的传输与共享;
-
随着文件种类的多样化,HTTP/1.0 通过增加方法,完善协议格式等方式实现所有格式文件的传输与共享。
但是,此时的HTTP连接还只能发送一个请求,而且在数据传输完成后,该连接立即关闭; 此时如果需要请求其他资源,就必须再新建一个连接。
问题在于 HTTP 是基于 TCP/IP 的应用层协议,每一个连接的建立客户端和服务器都需要进行三次握手,并且信息开始传输时的速率也比较慢(slow start)。所以,随着网页加载的外部资源越来越多,HTTP/1.0的性能问题就愈发突出了。此时,就有浏览器在请求时,将非标准的Connection字段设置为 keep-alive 用于连接的复用,从而改善该性能问题。 -
HTTP/1.1 版本 通过增加管道, 缓存, 持久连接等方法,增强了每个连接的有效使用率。虽然 HTTP/1.1 已经优化了很多点,并且也是目前使用最广泛的协议, 但是随着网页的复杂性越来越高,HTTP/1.1也暴露出了一些其他问题。 比如,虽然复用了TCP连接后通信效率有所提高, 但是当多个请求同时到达得到时候,仍需依次处理,当请求较多时则会发生头部阻塞; 又比如传输的内容是明文,缺乏安全保障。
-
基于HTTP/1.1 所暴露的这些问题,HTTPS 和 SPDY 协议就被尝试用于市面, HTTPS 和 SPDY 并不是两种新的协议,都是基于HTTP协议,在HTTP层下分别添加了SSL层 和 SPDY会话层。具体做了什么样的改动我们不详细展开,但是目标肯定是为了解决HTTP/1.1 所暴露出来的问题。 也是基于这两种协议的积极尝试,HTTP/2 终于在2015年诞生。
最后,需求推进发展, 用户需求越来越高,协议也就越来越完善。