HTTP 简史复习
简要复习一下HTTP的发展历史。
HTTP/0.9
初代不成熟协议,只支持GET
命令,仅接受HTML格式的子串,一次请求结束之后TCP连接随即关闭。
HTTP/1.0
不仅支持HTML,还支持图片、视频、二进制文件等。
增加了 POST HEAD,
每次Req和Resp都必须含有头部。整个头部只能使用ASCII编码
新增了状态码、权限、缓存、内容编码(content encoding)等功能。
新增Content-Type字段。
缺点:
但是每次只能发送一个请求,三次握手比较慢,另外需要慢启动。
连接复用采用 Connection: keep-alive
字段,该字段非标准。
HTTP/1.1
RFC 2616
第一个有正式标准的版本。
举个 🌰
1 | $> telnet website.org 80 |
①:附带了encoding,charset和cookie元信息请求HTML文件
②:分块传输结果
③:分块的大小,以ASCII 十六进制表示。 100代表256字节。
④:用0,代表整个Response分块结束。
⑤:使用同一条TCP连接请求图标文件
⑥:提醒服务器,这个连接将不再被复用,可以关闭连接。
⑦:返回图标文件的信息,并在结尾处关闭连接。
以上样例重点贯彻了HTTP/1.1
的连接复用、分块以及显式关闭等特征。
特征:
- 默认TCP连接不关闭,可以被多个请求复用。不像HTTP/1.0还必须明确指明 Connection: Keep-Alive。
- 管道机制:同一个TCP连接,客户端可以发送多个请求。为了切分每个请求,必须在头部注明Content-Length
- 分块传输 chunk。
其他功能
增加了 content, encoding, character set 等字段。
Host 字段
PUT PATCH HEAD OPTIONS DELETE
缺点
队头堵塞 Head-of-line blocking
SPDY
谷歌自研 2009年 ,HTTP/2的基础
HTTP/2
注意,不叫HTTP/2.0
,下一个版本将是HTTP/3
。
二进制协议
HTTP/1.1 的header肯定是ASCII,数据体可以是文本或二进制。
HTTP/2 是一个彻底的二进制协议,header和body都是二进制,并且统称为帧
:头信息帧和数据帧。
多工 Multiplexing
HTTP/2 复用了TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而不是按照顺序。这避免了队头堵塞
。
数据流
因为HTTP/2的数据包不按顺序发送,所以要指出每个数据包属于哪个回应。
每个请求或回应的所有数据包,称为一个数据流。每个数据流有个独一无二的ID。
客户端来的数据包的ID是奇数,服务端发送的数据包ID是偶数。
头信息压缩
一方面头可以压缩;另一方面,客户端和服务端维护了一张索引表,不用发送相同的字段。
服务器推送
未经过客户端的主动请求,服务器可以主动向客户端发送资源。
参考:
http://www.ruanyifeng.com/blog/2016/08/http.html
https://github.com/abbshr/rfc7540-translation-zh_cn
https://tools.ietf.org/html/rfc7540 / https://httpwg.org/specs/rfc7540.html
https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn
https://hpbn.co/brief-history-of-http/