一、http1.1
解决了http1.0时代最重要的2大问题:
http1.0 | http1.1 |
---|---|
每个TCP连接只能发送一个请求,也就是服务器在发送完一个HTTP响应后会断开TCP连接 | 浏览器默认开启【长连接】,Connection:keep-alive,在一个TCP连接上可以传送多个HTTP请求和响应 |
【队头阻塞】多个请求无法并行发送,只能排队 | 【管线化】,可以并行发出请求,并没有根本解决队头阻塞问题,对于请求的响应仍然遵循先进先出的原则 |
1.1 Connection: keep-alive
![]() |
![]() |
---|
二、http2.0
- http2.0的协议解析采用二进制格式,而非HTTP1.x的文本格式。
- 【多路复用】一个TCP连接上可以有多个流,一个请求对应一个流并分配一个唯一标识。为每帧分配一个流标识符,所有流的帧可以混杂在一起,接收方可以通过帧的流标识符知道该帧属于哪个请求,解决队头阻塞问题(流是连接中的一个虚拟信道,可以承载双向消息)
2.1 连接复用
![](https://img.haomeiwen.com/i15528678/91887efffe0864b5.png)
三、服务端消息推送
- 轮询
客户端定时发送请求——频率高容易产生大量无效请求,频率低实时性会变差 - 长轮询
客户端发送请求——服务器并不马上返回,而是保持这个连接,等待数据更新后再返回。客户端收到后又马上开启新一轮请求。——这样减少了请求次数,也降低了延迟,但服务端就要保持大量的连接 - WebSocket
实现客户端和服务器的长连接,进行双向实时通信。HTTP和WebSocket都是应用层协议,都是基于TCP来传输数据的
四、http请求建立TCP连接时的三次握手
主要是确认双方的发送和接收能力是否正常
![](https://img.haomeiwen.com/i15528678/57e9c70a47e51c9c.png)
五、释放连接时的四次挥手
客户端:申请断开
服务端:已接收到请求
服务端:可以断开
客户端:好的
六、https
6.1 http的弊端
- 被窃听
- 被篡改
- 被冒充
6.2 ssl/tls加密
![](https://img.haomeiwen.com/i15528678/ae243eafa1f8dbe5.png)
- 对称加密:接收方和发送方使用同样的加解密方式
- 非对称加密:数据经过公钥加密就只能使用私钥解密
6.2.1 服务器申请数字证书
![](https://img.haomeiwen.com/i15528678/0169d2686c899d8a.png)
- 服务器向CA提交自己公钥和身份信息
- CA用这些信息通过摘要算法生成摘要
- CA用自己的私钥对摘要进行加密生成数字签名
- 将身份信息、公钥、数字签名等整合成数字证书颁发给服务器
![](https://img.haomeiwen.com/i15528678/7102ef53e379528a.png)
![](https://img.haomeiwen.com/i15528678/779f5df0c2c04ca2.png)
6.2.2 客户端验证证书
![](https://img.haomeiwen.com/i15528678/2f63201e0f511366.png)
- 客户端收到证书,用CA的公钥(内置在操作系统)对数字签名进行解密,拿到摘要
- 客户端也用摘要算法(公开)对证书明文生成摘要
- 2个摘要比对
6.2.3 加密通信
- 最终通信使用的还是对称加密
- 之前的非对称加密是为了协商【之后用来对称加密的秘钥】,以保证这个秘钥只有双方知道
![](https://img.haomeiwen.com/i15528678/0f49887a42b6d668.png)
6.3 http与https的区别
- | http | https |
---|---|---|
默认端口 | 80 | 443 |
- |
![]() |
![]() |
- | 明文传输 | 使用tls协议加密传输 |
七、 http3
将TCP的握手和tls的握手整合在一起
八、 一些常见的请求头和响应头
- | 请求头 | 响应头 |
---|---|---|
缓存相关 | if-modified-since / if-none-match | last-modifed / etag / cache-control / expires |
content相关 | Content-Type / Content-Length | 一样 |
content编码方式 | accept-encoding: gzip, deflate, br | content-encoding: br |
cookie | cookie | set-cookie |
跨域相关 | Origin | Access-Control-Allow-Origin 、 Access-Control-Allow-Methods、Access-Control-Allow-Headers |
跨域相关 | Access-Control-Allow-Credentials: true(允许客户端携带验证信息,告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码) |
网友评论