一、HTTP
1 什么是HTTP
HTTP协议又叫做超文本传输协议,当我们在浏览器输入url之后,浏览器发送请求,服务端接收到这个请求之后响应请求,然后返回内容。
在这一过程中需要一些规范来约束客户端的请求和服务端的响应,这个规范就是HTTP协议。
HTTP是我们在开发过程中接触最频繁的,每当我们排查问题的时候第一件事就是f12看看HTTP请求。
2.HTTP的发展历程
2.1 诞生
1989年蒂姆伯纳斯李提出了一种能让远隔两地的研究者们共享知识的设想,借助多文档之间相互关联形成超文本连成可相互参阅的www。
已经提出了3项www构建技术
SGML标准通用标记语言作为页面的文本标记语言的html超文本标记语言;
作为文档传递协议的http;
指定文档所在地的url统一资源定位符;
2.2 版本
HTTP/0.9
只支持GET请求
不支持请求头
只支持纯文本
HTTP/1.0
添加了POST、HEAD等请求方法
添加了请求头
Content-Type可以支持多种数据格式,除了文本也支持图片、音视频等。
HTTP/1.1
持久化
管线化
增了请求方式PUT、PATCH、OPTIONS、DELETE等。
客户端请求的头信息新增了Host字段,用来指定服务器的域名。
HTTP/2.0
二进制分帧
多路复用
头部压缩
服务器推送
3.cookie
http是无状态的
http是不保存状态的,也就是http对发送过的请求或响应都不做持久化处理
http1.1虽然是无状态协议,但是为了实现期望的保持状态功能于是引入了cookie技术
关于cookie可以看这篇文章
架构设计:登录设计 - Session和Cookie实现登录
4.报文分类
http协议规定,请求从客户端发出,最后服务器端响应请求并返回
按照请求方式分
http报文分为请求报文和响应报文
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段、内容实体
响应报文是由协议版本、状态码、状态码解释短语、可选的响应首部字段、实体主体
按报文内容分
http报文分为报文首部和报文主体,两者最初用空行来划分,通常不一定有报文主体。
请求报文首部:请求行、请求首部字段、通用首部字段、实体首部字段、其它
响应报文首部:状态行、响应首部字段、通用首部字段、实体首部字段、其它
请求行:包含请求的方法,请求URI和HTTP版本
状态行:包含表明响应结果的状态码,原因短语和HTTP版本
二、HTTP/1.1
1.持久化
在HTTP/1.1之前的版本,每进行一次HTTP通信就要断开一次TCP连接。这样存在很大的缺点不仅浪费而且还会导致页面刷新很慢,就现在一个网页就有上百个请求,每个请求都要去通过三次握手,四次挥手来建立连接,很影响效率。
为了解决这个效率问题,在HTTP1.1中提出了持久化连接,既然每次都要重建TCP连接,那为何不保持TCP连接呢?只要任意一端没有明确提出断开连接,则保持TCP连接,这样HTTP请求就可以基于这个连接的TCP进行。引入了持久化即TCP连接默认不关闭,可以被多个请求复用
2.管线化
管线化pipelining,也可以叫做流水线技术,基于HTTP持久化技术,我们可以在这上面进一步的优化,以前是发送请求,接收响应,再发送请求。现在TCP通道是保持连接的,那我们就可以并行发送多个HTTP请求,而不需要一个请求结束后再等发送下一个请求。
虽然管线化技术可以并发的发送了请求提高了效率,但是服务器响应的时候是排队响应的,谁先到达响应谁,如果某个响应阻塞了,后面的响应也会被阻塞,这就是队头阻塞。
三、 HTTP/2.0
1.二进制分帧
1.1 帧
在HTTP/2.0中帧是最小的通信单位。HTTP/2.0之前的版本的请求被切分成多个帧来进行通信。
在 HTTP 2.0中,它把数据报的两大部分分成了header frame和 data frame。也就是头部帧和数据体帧。
每一个帧都包含固定的几个字段:length、type、flags、stream identifier、frame playload等。
其中type表示帧的类型,总共有十种类型的帧:HEADERS frame 和 DATA frame、 PRIORITY(设置流的优先级) RST_STREAM(终止流)SETTINGS(设置此连接的参数) PUSH_PROMISE(服务器推送) PING(测量 RTT) GOAWAY(终止连接)WINDOW_UPDATE(流量控制) CONTINUATION(继续传输头部数据)
1.2 流
流是连接中的一个虚拟信道,可以承载双向消息传输。每个流有唯一整数标识符。为了防止两端流ID冲突,客户端发起的流具有奇数ID,服务器端发起的流具有偶数ID。
流标识是描述二进制frame的格式,使得每个frame能够基于http2发送,与流标识联系的是一个流,每个流是一个逻辑联系,一个独立的双向的frame存在于客户端和服务器端之间的http2连接中。一个http2连接上可包含多个并发打开的流,这个并发流的数量能够由客户端设置。
2.多路复用
通过二进制分帧的方法把请求数据分成了多个帧,然后通过流来发送,每个帧相互之间没依赖关系可以分开发送,发送到了服务器再组装成一个请求。
3.header压缩
如果是在同一个网页的请求,每个请求带的头部信息大概了会是一样的,如果每次都要发送这些请求,造成了重复发送,降低了效率。
HTTP/2.0采用了HPACK压缩算法对头部数据进行压缩,同时客户端后和服务端各自缓存一份header fields表,避免了重复发送头部数据。
4.服务端推送
服务端推送简单来说,就是从以前的客户段主动获取到现在的服务端主动推送资源给客户段。
例如网页请求a.css的时候,服务端会主动把a.js推送给客户段,这样客户段需要a.js的时候就直接从本地缓存中获取了,不需要再从服务端去获取了。