互联网构建超链接文档系统的构想,三项关键技术:
- URI 统一资源标识符
- HTML 超文本标记语言
- HTTP 超文本传输协议
HTTP/0.9
网络上绝大多数的资源都是纯文本格式。(因为起初 蒂姆·伯纳斯-李最初设想的系统里的文档都是只读的),所以只允许用“GET”动作从服务器获取HTML文档,并在响应请求之后立即关闭连接。
- 纯文本格式传输
- 只有GET方法
HTTP/1.0
于是在这些已有实践的基础上,经过一系列的草案,HTTP/1.0 版本在 1996 年正式发布。它在多方面增强了 0.9 版,形式上已经和我们现在的 HTTP 差别不大了,例如:
- 增加了 HEAD、POST 等新方法;
- 增加了响应状态码,标记可能的错误原因;
- 引入了协议版本号概念;
- 引入了 HTTP Header(头部)的概念,让 HTTP 处理请求和响应更加灵活;
- 传输的数据不再仅限于文本。(因为1992年发明了JPEG图像格式,1995年发明了MP3音乐格式)
但 HTTP/1.0 并不是一个“标准”,只是记录已有实践和模式的一份参考文档,不具有实际的约束力,相当于一个“备忘录”。
HTTP/1.1--正式的标准
1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都希望在互联网上占据主导地位。最后IE取得了决定性的胜利。后来网景凭借 Mozilla Filefox 又扳回一局。
不过,说 HTTP/1.1 是“小幅度修正”也不太确切,它还是有很多实质性进步的。毕竟经过了多年的实战检验,比起 0.9/1.0 少了“学术气”,更加“接地气”,同时表述也更加严谨。HTTP/1.1 主要的变更点有:
- ’增加了 PUT、DELETE 等新的方法;
- 增加了缓存管理和控制;
- 明确了连接管理,允许持久连接(keep-Alive);
- 允许响应数据分块(chunked),利于传输大文件;
- 强制要求 Host 头,让互联网主机托管成为可能。
出现的问题:请求队列出现队头阻塞。
HTTP/2
HTTP/1.1 发布之后,整个互联网世界呈现出了爆发式的增长,度过了十多年的“快乐时光”,更涌现出了 Facebook、Twitter、淘宝、京东等互联网新贵。
这期间也出现了一些对 HTTP 不满的意见,主要就是连接慢,无法跟上迅猛发展的互联网,但 HTTP/1.1 标准一直“岿然不动”,无奈之下人们只好发明各式各样的“小花招”来缓解这些问题,比如以前常见的切图、JS 合并等网页优化手段。
Google 首先开发了自己的浏览器 Chrome,然后推出了新的 SPDY 协议。Google 借此顺势把 SPDY 推上了标准的宝座,互联网标准化组织以 SPDY 为基础开始制定新版本的 HTTP 协议,最终在 2015 年发布了 HTTP/2,RFC 编号 7540。
HTTP/2 的制定充分考虑了现今互联网的现状:宽带、移动、不安全,在高度兼容 HTTP/1.1 的同时在性能改善方面做了很大努力,主要的特点有:
- 二进制协议,不再是纯文本;
- 可发起多个请求,废弃了 1.1 里的管道;
- http1.1的长久连接,出现了队头阻塞,后来为了解决队头阻塞,提出了并发连接。
- 并发多个请求,必须使用多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制
- 最后一种性能优化:域名分片。
- 使用专用算法压缩头部,减少数据传输量;
- 允许服务器主动向客户端推送数据;增强了安全性,“事实上”要求加密通信;
- 服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。
HTTP/3
在 HTTP/2 还处于草案之时,Google 又发明了一个新的协议,叫做 QUIC。
总结:
HTTP发展的原动力:用户的需求,以用户体验为核心,更快,更安全,更稳定。
注:
本文纯属学习笔记,参考罗剑锋老师的《透视HTTP协议》