目录
一、定义
HTTP(HyperText Transfer Protocol),是超文本传输协议,是目前互联网上要用最广泛的一种网络协议,所有的 WWW文件都必须遵守该标准。HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。
二、http工作流程
说法一
- 建立起客户机和服务器连接。
- 建立连接后,客户机发送一个请求给服务器。
- 服务器收到请求给予响应信息。
- 客户端浏览器将返回的内容解析并呈现,断开连接。
说法二
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。
connection :keep-alive 可以保持长连接
三、http1、http2
1.http1
a.http1.0
默认短连接,每次请求都必须建立一次连接,通过tcp三次握手后开始传输数据,连接结束进行四次挥手断开连接。
缺点:连接无法复用,每次都需要重新连接增大开销
优点:
b.http1.1
特点:
- 默认长连接,通过Keep-Alive保持HTTP连接不断开,避免重复建立TCP连接
- 管道化,通过长连接实现在一个连接中传输多个文件
- 加入缓存处理(新字段cache-control)
- 支 持断点续传
- 增加了Host字段,实现了在一台WEB服务器上可以同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点
优化也带来了性能性问题-高延迟;比如请求-响应模型、头部巨大且重复、并发连接耗时、服务器不能主动推送等,
2.http2
第一点,HTTP/2 没有在 URI 里引入新的协议名,仍然用「http://」表示明文协议,用「https://」表示加密协议,于是只需要浏览器和服务器在背后自动升级协议,这样可以让用户意识不到协议的升级,很好的实现了协议的平滑升级。
只在应用层做了改变,还是基于 TCP 协议传输,应用层方面为了保持功能上的兼容,HTTP/2 把 HTTP 分解成了「语义」和「语法」两个部分,「语义」层不做改动,与 HTTP/1.1 完全一致,比如请求方法、状态码、头字段等规则保留不变。
但是,HTTP/2 在「语法」层面做了很多改造,基本改变了 HTTP 报文的传输格式。
头部压缩-HPACK算法
HPACK 算法主要包含三个组成部分:
-
-
静态字典;
-
动态字典;
-
Huffman 编码(压缩算法);
-
客户端和服务器两端都会建立和维护「字典」,用长度较小的索引号表示重复的字符串,再用 Huffman 编码压缩数据,可达到 50%~90% 的高压缩率。
二进制帧
HTTP/2 厉害的地方在于将 HTTP/1 的文本格式改成二进制格式传输数据,极大提高了 HTTP 传输效率,而且二进制数据使用位运算能高效解析。HTTP/2 把响应报文划分成了两个帧(Frame),图中的 HEADERS(首部)和 DATA(消息负载) 是帧的类型,也就是说一条 HTTP 响应,划分成了两个帧来传输,并且采用二进制来编码。
并发传输
在http1中如果使用多线程建立多个连接,从而同时处理多个请求,但是同一个域名下浏览器可以建立的连接数有限,一般是6个,也就是最多同时可以发送6个请求,即使采用的资源分片技术,这样也会有一些其它的问题,例如:
- 每一个线程都需要占用一定的系统资源
- 对各连接会将大量的实践花费在TCP连接上,如果使用的是HTTPS还存在着TLS验证的时间浪费。
- 对个TCP连接也可能会造成整个网络环境的拥塞,最终导致整个吞吐量的下降
我们都知道 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应),才能处理下一个事务,也就是说在发出请求等待响应的过程中,是没办法做其他事情的,如果响应迟迟不来,那么后续的请求是无法发送的,也造成了队头阻塞的问题。
在HTTP/2对上述问题进行解决,实现并发传输。
HTTP/2 通过 Stream 这个设计,多个 Stream 复用一条 TCP 连接,达到并发的效果,解决了 HTTP/1.1 队头阻塞的问题,提高了 HTTP 传输的吞吐量,在1.1版本中的难点是接收方无法区分收到的数据包属于哪一个请求,而流标识就很好的解决了这个问题,而且只使用一条TCP连接就实现的多路复用。
详细连接:
cHTTP/2与HTTP/1的比较 - Mr-xxx - 博客园 (cnblogs.com)