简介
HTTP请求行的第三个就是HTTP的版本了,HTTP经过了五个较大版本改动时代,HTTP0.9,HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0。接下来就细说HTTP的历史
万维网
1989年, 当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 Mesh,在随后的1990年项目实施期间被更名为万维网(World Wide Web)。
- 一个用来表示超文本文档的文本格式(HTML)
- 一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。
- 一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 WorldWideWeb。
- 一个可用于访问文档的服务器
HTTP0.9
最初版本的HTTP协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。 HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法GET开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。
看一些请求与响应
请求
GET /mypage.html
响应
<HTML>
这是一个非常简单的HTML页面
</HTML>
跟后来的版本不同,HTTP/0.9 的响应内容并不包含HTTP头,这意味着只有HTML文件可以传送,无法传输其他类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的HTML文件将被发回,供人们查看。
HTTP1.0
由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广:
- 协议版本信息现在会随着每个请求发送(
HTTP/1.0被追加到了GET行)。 - 请求的方法增加了,增加了HEAD,POST,PUT,DELETE,LINK,UNLINK(后面两个在HTTP1.1废除了)
- 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。
- 引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
- 在新HTTP头的帮助下,具备了传输除纯文本HTML文件以外其他类型文档的能力(凭借
Content-Type头)。 - 一个请求一个连接,不可复用(和HTTP0.9一样)
看一下请求与响应
请求
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
响应
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
一个包含图片的页面
<IMG SRC="/myimage.gif">
</HTML>
请求
GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
响应
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(这里是图片内容)
在1991-1995年,这些新扩展并没有被引入到标准中(就是没有写RFC文档),而仅仅作为一种尝试:服务器和浏览器添加这些新扩展功能,但出现了大量的互操作问题。直到1996年11月,为了解决这些问题,一份新文档(RFC 1945)被发表出来,用以描述如何操作实践这些新扩展功能。文档 RFC 1945 定义了 HTTP/1.0,但它是狭义的,并不是官方标准。
HTTP1.1
HTTP/1.0 多种不同的实现方式在实际运用中显得有些混乱,自1995年开始,即HTTP/1.0文档发布的下一年,就开始修订HTTP的第一个标准化版本。在1997年初,HTTP1.1 标准发布,就在HTTP/1.0 发布的几个月后。
- 连接可以复用,节省了多次打开TCP连接加载网页文档资源的时间。(对HTTP1.0的改进,连接复用)
- 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。(是将多个HTTP请求(request)整批提交的技术,而在发送过程中不需先等待伺服端的回应,没多大作用,接收的时候还是得按顺序接收)
- 支持响应分块。(对于大文件分块传输,但是在HTTP2.0被废除了,一是因为流机制更高级,二是有些服务器要实现这个的话还要注意响应拆分漏洞,感兴趣的可以看看这个)
- 引入额外的缓存控制机制。(例如条件GET)
- 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。(对HTTP1.0的规范化)
- 凭借
Host头,能够使不同域名配置在同一个IP地址的服务器上。(让域名和IP变成了多对一的关系)
请求于响应
请求
GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
响应
200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Content-Length: 1034
Vary: Cookie, Accept-Encoding
HTTP/1.1 在1997年1月以 RFC 2068 文件发布。由于HTTP协议的可扩展性 – 创建新的头部和方法是很容易的 – 即使 HTTP/1.1 协议进行过两次修订,RFC 2616 发布于 1999 年 6 月,而另外两个文档 RFC 7230-RFC 7235 发布于 2014 年 6 月(在 HTTP/2 发布之前)。HTTP/1.1 协议已经稳定使用超过 15 年了。
HTTP用于安全传输
HTTP最大的变化发生在1994年底。HTTP在基本的TCP/IP协议栈上发送信息,网景公司(Netscape Communication)在此基础上创建了一个额外的加密传输层:SSL 。SSL 1.0没有在公司以外发布过,但SSL 2.0及其后继者SSL 3.0和SSL 3.1允许通过加密来保证服务器和客户端之间交换消息的真实性,来创建电子商务网站。SSL在标准化道路上演变成了TLS,TLS1.0,TLS 1.1,TLS1.2的成熟发展,TLS 1.3 也在慢慢完善。
与此同时,人们对一个加密传输层的需求也愈发高涨:因为 Web 最早几乎是一个学术网络,相对信任度很高,但如今不得不面对一个险恶的丛林:广告客户、随机的个人或者犯罪分子争相劫取个人信息,将信息占为己有,甚至改动将要被传输的数据。随着通过HTTP构建的应用程序变得越来越强大,可以访问越来越多的私人信息,如地址簿,电子邮件或用户的地理位置,即使在电子商务使用之外,对TLS的需求也变得普遍。
HTTP用于复杂应用
Tim Berners-Lee 对于 WWW 的最初设想不是一个只读媒体。 他设想一个 WWW 是可以远程添加或移动文档的一种分布式文件系统。 大约 1996 年,HTTP 被扩展到允许创作,并且创建了一个名为 WebDAV 的标准。 它进一步扩展了某些特定的应用程序,如 CardDAV 用来处理地址簿条目,CalDAV 用来处理日历。 但所有这些 DAV 扩展有一个缺陷:它们必须由要使用的服务器来实现,这是非常复杂的。并且他们在网络领域的使用必须保密。
在 2000 年,一种新的使用 HTTP 的模式被设计出来:representational state transfer (或者说 REST)。 由 API 发起的操作不再通过新的 HTTP 方法传达,而只能通过使用基本的 HTTP / 1.1 方法访问特定的 URI。这种风格官方的话说呢就是表述性状态传递,其实实际上就一般给一个资源一个URL,然后提供不同方法的服务(GET表示获取资源,POST新建资源,PUT更新资源,DELETE删除资源)。
HTTP2.0
从上面也可以看见HTTP的生态圈正在快速发展,HTTP1.1的一些缺点(管线化,也就是大家说的容易造成队头阻塞)已经满足不了需求了,这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多:更多的数据通过HTTP请求被传输。HTTP/1.1链接需要请求以正确的顺序发送,理论上可以用一些并行的链接(尤其是5到8个),带来的成本和复杂性堪忧。
在2010年到2015年,谷歌通过实践了一个实验性的SPDY协议,证明了一个在客户端和服务器端交换数据的另类方式。其收集了浏览器和服务器端的开发者的焦点问题。明确了响应数量的增加和解决复杂的数据传输,SPDY成为了HTTP/2协议的基础。
HTTP/2在HTTP/1.1有几处基本的不同:
-
HTTP/2是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。一个请求对应为为多个数据包,每个数据包上都有编号,还可以指定数据包优先级(也就是请求优先级)(二进制报文)
image.png 这是一个复用协议。并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。(多路复用,解决队头阻塞)
压缩了headers。因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。(头部压缩)
其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。(服务器推送)
在2015年5月正式标准化后,HTTP/2取得了极大的成功,在2016年7月前,8.7%的站点已经在使用它,代表超过68%的请求。高流量的站点最迅速的普及,在数据传输上节省了可观的成本和支出。
这种迅速的普及率很可能是因为HTTP2不需要站点和应用做出改变:使用HTTP/1.1和HTTP/2对他们来说是透明的。拥有一个最新的服务器和新点的浏览器进行交互就足够了。只有一小部分群体需要做出改变,而且随着陈旧的浏览器和服务器的更新,而不需Web开发者做什么,用的人自然就增加了。
HTTP3.0
这个东西可以作为一个亮点去了解,里面关于UDP的部分还蛮有意思的,这里我就不多说了,喜欢的同学可以看看Daniel Stenberg写的HTTP3详解(有中文版的,咱们中国人开源翻译的),Daniel Stenberg的HTTP2详解也写得挺好的,他还是cURL的创始人。
