1.什么是 HTTP协议
HTTP是一种用来传输超文本的网络协议
1.1 HTTP网络模型(5层)
应用层:只负责给用户提供应用的功能,比如不同设备之间的应用通信。
传输层:给应用层提供网络支持,作为应用之间数据传输的媒介,实际传输功能由网络层提供。主要使用TCP和UDP两种传输协议,在应用程序之间传输报文
网络层:负责主机与主机之间的数据报传输,使用IP地址给不同设备编号。所以所有具有网络层的因特网组建都必须运行IP协议
数据链路层:因为当两个需要通信的设备在不同的网络中,就需要有一个专门的层来标识网络中的设备,数据链路层就是为网络层提供链路级别传输的服务。Mac地址
物理层:数据包转化为电信号,提供二进制传输服务
1.2 HTTP常见字段
Host:指定域名
Content-length:本次回应的数据长度
Connection:用于客户端要求服务器使用TCP持久连接
Content-type:通知客户端本次回应数据是什么格式。客户端可以使用Accept声明自己可以接受哪些格式的数据
Content-Encoding:说明数据的压缩方法,表示服务端返回的数据是使用的那种压缩格式。客户端可以使用Accept声明自己可以接受哪些压缩的方法
1.3 HTTP特性
- 易学:基本的报文格式就是header+body,头部信息是k-v形式
- 灵活和易于扩展:协议的组成要求没有固定死,开发人员可以自定义和扩充。比如HTTPS的出现就是因为HTTP的灵活性
- 应用广泛且跨平台
1.4 HTTP缺点
- 无状态:虽然不会消耗额外的资源记录状态,但是在完成关联性操作的时候就会很麻烦。解决方法:比较简单直接的就是在报文和响应头中使用Cookie
- 明文传输:明文传输有利于调试工作,但是信息没有隐私可言,很容易被抓包窃取。
- 安全性低:解决方案:使用HTTPS,也就是引入SSL/TLS层,保证安全性
2.HTTP和HTTPS
HTTPS解决了HTTP不安全的缺陷,在TCP连接建立后进行SSL/TLS的握手过程,进行加密报文传输
HTTPS协议需要向证书权威机构申请数字证书,保证服务器身份可信
在建立连接的时候,HTTPS多了一个SSL/TLS握手过程
在传输内容的时候,HTTPS会使用会话秘钥进行数据加密
HTTPS是怎么解决安全风险的?
混合加密:
实现信息的机密性,防止了被窃听的风险。
在通信建立前采用非对称加密,交换密钥,通信过程中使用对称加密密钥对明文数据进行加密。这解决了非对称加密速度慢,对称加密不够安全的缺点
摘要算法:
通过摘要算法为数据生成hash值校验完整性,这可以很好地防止数据 被篡改。
数字证书:
数字证书可以证明服务器公钥的身份是合法的,可以放心使用,不担心是钓鱼网站
SSL/TLS协议基本流程(4次握手)
客户端向服务器索要并验证服务器公钥
客户端和服务端协商产生 会话密钥
双方采用会话密钥进行加密通信
客户端发送随机数、支持的密码套件和自己支持的SSL/TSL版本到服务器
服务器如果不支持客户端的SSL/TSL版本,就关闭加密通信。如果支持,服务器将自己的证 书和随机数返回给客户端,双方sayHello完成。
客户端判断证书是否安全,并发送一个用服务器公钥加密的新的随机数(这是整个流程的第三随机数) 和 加密通信算法已改变的通知以及客户端握手结束的通知。使用双方产生的这三个随机数根据协商的加密算法生成会话秘钥,客户端生成所有握手数据的摘要供服务端校验。
服务器接收到公钥加密的这个随机数后,使用双方产生的这三个随机数根据协商的加密算法生成会话秘钥,告知客户端下次通信将以新的这个秘钥通信的消息以及服务端握手结束的通知,生成握手数据的摘要供客户端校验。
3.HTTP的演变
HTTP1.0的缺点:
HTTP1.0性能上最大的缺陷就是它采用的是短连接方式,每发送一个请求,就要建立一次TCP连接,这样会造成不必要的开销,增加服务器的负载
HTTP1.1:
HTTP1.1使用长连接减少了TCP连接的重复建立,解决了HTTP1.0造成的负载问题。
管道网络传输保证了长连接的实现。以前在同一个TCP连接中,必须等发送出去的请求得到服务器响应后,才会发送下一个请求,使用管道网络传输,客户端就可以发送多个请求,减少整体的响应时间。如果响应特别慢而且请求比较多,就会发生后面的请求一直在等待的情况,这被称作队头堵塞
缺点:
队头堵塞
请求头/响应头 未经过压缩就发送,首部信息越多延迟就会越大
每次发送相同的冗长首部就会浪费网络资源
没有优先级的控制
服务器只能被动响应
HTTP2:
HTTP2是基于HTTPS的协议,解决了HTTP1.1中的问题
头部压缩
如果同时发出多个请求,他们的头是一样或者相似的,HTTP2就会消除重复的部分。这是(HPACK算法)因为客户端和服务器同时维护一张头信息表,表里面有的字段,之后只需要发送对应的索引即可
明文报文->二进制报文
将头信息和数据体以二进制的形式进行传输,省去了报文转换的过程,增加数据传输效率。
数据流
HTTP2的数据包是同一个连接里面连续的数据包,不是按顺序发送,回应的顺序也不一定相同。每个请求或者回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号,客户端的是奇数并且可以指定优先级,服务器的是偶数
多路复用
HTTP2支持在一个连接中并发多个请求或回应,不用按照顺序对应,移除了HTTP1.1的串行请求,不再需要排队等待,解决了队头阻塞问题。降低了延迟,提高连接的利用率
服务器主动推送
服务器可以在发送html资源的时候将js和css资源也提前发送过去,如果推送的资源服务器之前缓存过,客户端也可以拒绝接收。
缺点:
多个HTTP请求复用的一个TCP连接,一旦发生丢包现象,TCP会重传,TCP中的所有HTTP请求都必须等待这个丢的包重新传过来
HTTP3:
HTTP3将HTTP下层的TCP换成了UDP。
UDP虽然是不可靠传输,但是基于UDP的QUIC协议实现了类似TCP的可靠性传输!