HTTP知识笔记
HTTP
知识笔记
HTTP
版本版本变迁:
HTTP/0.9
,1991
年,只能使用GET
,请求不涉及数据包传输, 没有作为正式的标准;HTTP/1.0
,1996
年,传输内容格式不限制,增加PUT
、PATCH
、HEAD
、OPTIONS
、DELETE
命令,正式作为标准;HTTP/1.1
1997
年,持久连接(长连接)、节约带宽、HOST
域、管道机制、分块传输编码,2015
年前使用最广泛;HTTP/2
,2015
年,多路复用、服务器推送、头信息压缩、二进制协议等,逐渐覆盖市场。
HTTP
位于计算机网络模型的应用层,是基于TCP
的一个应用层协议。
虽然TCP
是面向连接的,但是HTTP
却是无连接的。
在Akamai
公司的演示页面上可以看到HTTP1.1
和HTTP2
的图片加载速度区别。
HTTP/1.0
- 使用
If-Modified-Since
,Expires
头部来控制缓存; - 不支持部分传输,某些时候我们只需传输文件整个的一段而已,传整个过来浪费了带宽,也容易造成长时间的占用一个连接;
- 每次传输数据都需要简历新的一个连接,当数据传输完成,连接就会关闭,无法复用已经传输完成的连接;
- 一个服务器绑定唯一一个
IP
地址; - 队头阻塞,即下一个请求必须在上一个请求完成才能进行传输,否则处于挂起状态。
HTTP/1.1
- 使用更多的头部来增强缓存控制策略,
Entity tag
,If-Unmodified-Since
,If-Match
,If-None-Match
; - 支持部分返回,新增
206
(Partial Content
)返回码来表示这是一个部分请求,通过Range
头部来指定文件的范围; - 由于虚拟主机的发展,现在一台服务器可以存在多个虚拟主机,它们共享一个
IP
地址,所以请求和响应头域必须附带Host
头域(指定主机名),不然直接返回400
错误; - 支持长连接,现在可以复用同一条
TCP
连接,无需重新建立TCP
连接来进行HTTP
请求,在头部增加Connection: keep-alive
默认开启该特性; - 支持请求流水线,由于支持长连接,现在可以复用同一条
TCP
连接,流水线,通俗点讲,就是可以在等待上一个资源还未返回结果的时候,进行新的资源请求,不过,资源的接收必须按照发送的顺利; - 细化错误的响应码,如
409
(Conflict
)表示请求的资源与资源的当前状态发生冲突;410
(Gone
)表示服务器上的某个资源被永久性的删除。
HTTP/2
相关RFC
为RFC7540
。
- 二进制分帧,
HTTP/2
通过在应用层和传输层之间增加一个二进制分帧层,使用二进制而非HTTP/1.1
的文本格式来传输数据,将请求报文或者响应报文分割成帧来传送; - 流标识,存在于连接中的一个虚拟通道,流可以承载双向消息,每个流都有一个唯一的整数
ID
,这样可以和其他流区分开; - 多路复用,
HTTP/1.1
虽然可以复用TCP
连接,但是必须顺序的响应请求结果,如果想要并发多个请求,则必须使用多个TCP
连接,浏览器对一个域名的TCP
连接数有限制,一般为6 - 8
个,超出限制的连接就会被挂起等待,等待前面的连接完成后才能进行发送,HTTP/2
由于使用了二进制分帧和流标识,使得全部的数据都可以在一条TCP
连接上完成,减少了创建多条TCP
连接带来的延时以及减少内存消耗; - 服务器推送,在发送
HTML
页面时,服务器可以主动的HTML
附带的CSS
和JS
一并推送给用户,减少请求次数; - 头部压缩,随着网络的发展,
HTTP
的请求大小越来越大,每次需要发送的冗余请求头非常多,HTTP/2通过在客服端和服务端各自维护一个“首部表”(类似一个Map
)来减少重复数据的传送,具体算法为HPACK
,具体可以查看相关的RFC
文档:HPACK: Header Compression for HTTP/2,这里涉及到哈夫曼编码,通过编码来减少请求头部过大带来的网络消耗。
很多大型应用已经开始转到HTTP/2
了,比如:
- 百度首页
- 淘宝首页