Open BGround opened 3 years ago
缺陷:线程阻塞,在同一时间,同一域名的请求有一定数量限制,超过限制数目的请求会被阻塞
缺陷:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接(TCP连接的新建成本很高,因为需要客户端和服务器三次握手),服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求; 解决方案:添加头信息——非标准的Connection字段Connection: keep-alive
- 采用二进制格式而非文本格式;
- 完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行;
- 使用报头压缩,降低开销
- 服务器推送
HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”:头信息帧和数据帧。 二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。
HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了”队头堵塞”。
HTTP/2 添加了一个二进制分帧层,那我们就结合图来分析下 HTTP/2 的请求和接收过程。
注意: HTTP1.1到HTTP2解决的是Http层面上的队首阻塞,是同一个长链接上的多个http请求之间的队首阻塞,只有前面的请求完事儿才轮到后面的请求;并不等同于TCP层面的队首阻塞, tcp的队首阻塞是数据包层面的,一个请求被分成有序的多个小的数据包,只有序号靠前的包确认完整接收,后续的包才能被处理;否则就不处理一直等这个包重传。这个机制导致的TCP层面 的队首阻塞。
HTTP/2 提供了请求优先级,可以在发送请求时,标上该请求的优先级,这样服务器接收到请求之后,会优先处理优先级高的请求
HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,比如Cookie,一样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。 对于相同的头部,不必再通过请求发送,只需发送一次; HTTP/2 对这一点做了优化,引入了头信息压缩机制; 一方面,头信息使用gzip或compress压缩后再发送; 另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。
HTTP/2 允许服务器未经请求,主动向客户端发送资源; 通过推送那些服务器任务客户端将会需要的内容到客户端的缓存中,避免往返的延迟
参看链接: 深入理解http1.x、http 2和https HTTP/2.0 原理!与 1.x 相比,到底优化了什么?
前面学习了http1和http2,http中如传输速度等一大堆缺陷得到解决,但是因为使用的是TCP协议,本质上TCP的协议还没有得到解决,具体有哪些呢?
在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞。
先理解一个概念
网络延迟又称为 RTT(Round Trip Time)。我们把从浏览器发送一个数据包到服务器,再从服务器返回数据包到浏览器的整个往返时间称为 RTT(如下图)。RTT 是反映网络性能的一个重要指标。
所以在数据传输之前,会有TCP的连接延时,HTTPS中还有TLS的连接延时
面对使用TCP协议中这些缺陷,HTTP3中开发一个折衷的协议,QUIC协议
参考文章: HTTP/3原理与实践
1.1 同一时间同一个TCP连接只能处理一个请求,采用一问一答的形式,上一个请求响应后才能处理下一个请求
追问:听说Chrome浏览器支持最大6个同域请求的并发?
因为chrome支持最大6个TCP连接
2.0 同域名上的所有通信都在单个连接上完成,每个连接上都可以进行交错的进行请求和响应
HTTP2.0是基于二进制的协议,HTTP1.1是基于文本分割解析的协议
1.1的报文解析结构里,服务器需要不断的读入字节,直到遇到换行符,处理的顺序是串行的
GET / HTTP/1.1 Accept: host: referer:
POST
2.0以帧为最小数据单位,每个帧都会有标识自己属于哪个流,多个帧组成一个流 多路复用,其实就是一个TCP连接里面存在多条流
HTTP的不足
HTTP 主要有这些不足,例举如下。
正式因为HTTP有这些不安全的地方,才催生更加完善的协议
HTTP+加密+认证+完整性保护 = HTTPS
HTTPS并非时应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。
HTTPS和HTTP的主要区别
上面说到HTTPS比HTTP传输数据更加的安全,而HTTPS解决这个问题的关键就是加密算法,具体就是混合加密算法(对称加密和非对称加密),下面就来学习下加密算法
对称加密算法 简单理解对称加密就是客户端和服务端拥有同样的密钥key,数据使用这个key加密之后再传输,但是有一个致命的问题,那就是既然双方要使用相同的密钥,那就必然要在传输数据之前先由一方把密钥传给另一方,那么在此过程中密钥就很有可能被截获,这样一来加密的数据也会被轻松解密。那如何确保密钥在传输过程中的安全呢?这就要用到非对称加密了。
非对称加密算法 非对称加密,顾名思义,就是加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
认识SSL和TSL
SSL协议提供的服务主要有:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
HTTPS 数据安全传输中客户端如何验证证书的合法性
最后贴几篇参考文章: