一、Http0.9
最初的HTTP是以简洁为出发点设计的,Http0.9是一个十分简单的协议,简单到请求只有一行。这行请求只有GET请求方法和要请求的文档路径。没有请求首部,也没有其他元素,其设计目的就是为了获取html纯文本。
1、Http0.9关键功能
- 基于客户端/服务器、请求响应的方式
- 服务器响应的是html文本数据
- 服务器与客户端之间的连接在每次请求之后都会关闭
2、请求/响应
GET/index.html
<html>
<body>
http 0.9
</body>
</html>
3、图解
4、总结
HTTP/0.9 只能发送 GET 请求,且每一个请求都单独创建一个 TCP 连接,响应端只能返回 HTML 格式的数据,响应完成之后 TCP 请求断开。
5、缺点
- 请求方式唯一
- 返回格式唯一
- TCP连接无法复用
二、Http1.0
1991年之后html规范和web浏览器软件获得了快速发展,Http0.9的很多性不足就暴露出来了,终于在 1996 年通过 RFC 1945 制定了 HTTP/1.0 规范。它在 HTTP/0.9 的基础上,增加了 HTTP 头部字段,极大扩展了 HTTP 的使用场景。 HTTP 1.0不仅可以传输文字,还能传输图像、视频、二进制文件,为互联网的迅速发展奠定了坚实的基础。
1、http1.0关键功能
- 请求部分增加了http版本号
- 响应部分增加了响应状态码
- 请求部分和响应部分都增加了头部字段也即请求首部字段、响应首部字段。
- 响应数据不局限于超文本(通过Content-Typ控制)
2、请求/响应
GET /mypage.html HTTP/1.0
User-Agent:NCSA_Mosaic/2.0(Windows7)
200 OK
Date: Tue, 15 Nov 1995 09:33:01 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<html>
<body>
http 1.0
</body>
</html>
3、图解
4、总结
HTTP/1.0 扩展了请求方法和响应状态码,并且支持定义 HTTP 头部字段,通过 Content-Type 头,我们就能传输任何格式的数据了。同时可以看出,HTTP/1.0 仍然是一个请求对应一个 TCP 连接,不能形成复用,还是比较耗费性能的。
5、缺点
- TCP 连接无法复用。
- HTTP 队头阻塞(一个 HTTP 请求响应结束之后,才能发起下一个 HTTP 请求)
- 一台服务器只能提供一个 HTTP 服务。
三、Http1.1
http1.0 版本刚刚制定6个月,http1.1 版本就发布了,HTTP/1.1 诞生于 1999 年,它进一步完善了 HTTP 协议,一直用到了 20 多年后的今天,仍然是使用最广的 HTTP 版本。Http1.1针对1.0的很多歧义做了改善。并且加入了很多重要的性能优化。
1、http1.1关键功能
(1)持久连接
支持持久连接,可以重用tcp连接对同一主机发送多次请求。
(2)分块编码传输
HTTP/1.1 实现了流式渲染,响应端可以不用一次返回所有数据,可以将数据拆分成多个模块,产生一块数据,就发送一块数据,这样客户端就可以同步对数据进行处理,减少响应延迟,降低白屏时间。
(3)字节范围请求
请求数据时不必请求全部内容,可只请求部分内容。
(4)请求管道
HTTP/1.1 中,多个 HTTP 请求不用排队发送,可以批量发送,这就解决了 HTTP 队头阻塞问题。但批量发送的 HTTP 请求,必须按照发送的顺序返回响应,相当于问题解决了一半,仍然不是最佳体验。
(5)增加 Host 头
- HTTP/1.1 实现了虚拟主机技术,将一台服务器分成若干个主机,这样就可以在一台服务器上部署多个网站了。
- 通过配置 Host 的域名和端口号,即可支持多个 HTTP 服务: Host: :
(6)其他扩展。
- 增加 Cache-Control、E-Tag 缓存头。
- 增加 PUT、PATCH、HEAD、 OPTIONS、DELETE 请求方法。
- 客户端cookie
2、请求/响应
GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10.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 201610:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 201600:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
<html>
<body>
http 1.1
</body>
</html>
3、图解
4、总结
HTTP/1.1 可以并行发起多个请求,并且也能复用同一个 TCP 连接,传输效率得到了提升。但响应端只能按照发送的顺序进行返回,为此很多浏览器会为每个域名至多打开 6 个连接,用增加队列的方式减少 HTTP 队头阻塞。
5、缺点
HTTP 队头阻塞没有彻底解决,响应端必须按照 HTTP 的发送顺序进行返回,如果排序靠前的响应特别耗时,则会阻塞排序靠后的所有响应。
6、补充
- Http1.1默认使用持久连接,可通过首部 Connection close关闭,后来http1.0页移植了这个功能,可以通过Connection:keep-Alive首部来启用。
- 如果使用的是http1.1,从技术上说不需要Connection:keep-Alive首部,但很多客户端还是选择加上他。
四、Http2.0
2009 年,Google 提出了 SPDY,SPDY 不是第一个希望替代 HTTP 的方案,但它是其中最重要的一个,因为它带来了显而易见的性能提升。
IETF 决定使用 SPDY 作为 HTTP/2.0 的起点,最终在 2015 年发布 HTTP/2.0 成为正式协议。它的最大的特点是 All in 二进制,基于二进制的特性,改进传输性能,实现低延迟和高吞吐量。HTTP/2.0 被寄予了如下期望:
- 请求优先级
- 多路复用
- 服务器端推送
- 头部压缩
在 HTTP/2 中发送请求时,既不需要排队发送,也不需要排队返回,彻底解决了 HTTP 队头阻塞问题。对于头部信息,资源缓存等痛点也进行了优化,似乎已经是一种很完美的方案了。
Http3.0
HTTP/2 在 HTTP + TCP 的架构上已经优化到了极致,如果要想继续优化,那就只能从这个架构入手了。
HTTP/3 目前还在草案阶段,它的主要特点是对传输层进行了优化,使用 QUIC 替换 TCP,彻底规避了 TCP 传输的效率问题。
The end
参考《Web性能权威指南》