HTTP
http是超文本传输协议,是一种无状态的协议。http是基于tcp的,因为tcp是可靠的数据传输。
一次完整的http传输包含三次握手与四次挥手,三次握手表示建立连接,四次挥手表示断开连接。
三次握手
- 客户端发送SYN,自身状态为SYN-SENT,等待服务器端确认,表示客户端可以向服务器端发送数据。SYN:同步序列编号。
- 服务器端收到SYN包,确认后向客户端发送SYN+ACK,自身状态为SYN-RECV,表示服务器端可以接收到客户端的数据,并告知客户端。
- 客户端发送确认包ACK,告诉服务器端自己可以接收到来自服务器的返回信息。
客户端服务器端均进入ESTABLISHED状态。连接建立成功。
三次握手完成,正式发送数据。
四次挥手
由于tcp是全双工通信(同时进行信号的双向传输),需要两方都确认关闭连接。所以一方结束后发送FIN表示确认关闭。首先发起关闭的一方为主动关闭,另一方为被动关闭。
- 客户端发起关闭连接,发送FIN。
- 服务器端收到客户端的FIN,发送确认号ACK为收到序列号+1。
- 服务器端被动关闭连接,向客户端发送FIN,告知客户端此方向也要关闭连接了。
- 客户端收到FIN,发送确认ACK。
HTTPS
https是http+ssl/tls协议
SSL协议是安全套接协议,TLS是安全传输协议。在https中都是用来加密传输内容的协议。
对称加密
使用一对公钥进行加密。
明文+公钥+加密算法 => 密文
密文+公钥+加密算法 => 明文
即通信双方有公钥就能对传输数据进行加密和解密,这在效率上是很高,安全性也好,但是问题在于公钥一旦被获取,则没有安全性可言。
非对称加密
使用一对密钥,分别为公钥,私钥。双方有各自不同的私钥,一对双方统一的公钥。
私钥加密公钥解,公钥加密私钥解
明文+公钥+加密算法 => 密文
密文+私钥+加密算法 => 明文
或者
明文+私钥+加密算法 => 密文
密文+公钥+加密算法 => 明文
这个方法看上去很妙,传输上是很安全的,因为公钥加密过的内容只有双方能解开。但是问题在于,如果公钥泄露,有坏人就可以伪造数据,发送给对方。
https全过程
https是结合了对称加密与非对称加密算法。
服务器使用非对称加密,生成一对公钥,私钥。
客户端使用对称加密,随机生成一对密钥。
https发送两次http请求
第一次http
- 客户端向服务端发起请求,建立连接。
- 服务器端将自己的公钥发送给客户端。
- 客户端检查公钥是否合法。
第二次http
- 合法后用公钥加密客户端的对称密钥,将加密后的密钥发送给服务器端。
- 服务器收到公钥加密的对称密钥,用私钥解密客户端密钥,用客户端密钥对数据进行加密。
- 服务器端将加密后的密文发送给客户端,客户端用对称密钥解密,收到数据。
这个过程中,由于公钥加密的数据只能私钥解,对客户端的密钥进行了保护,杜绝了过程中被盗取对称密钥 的可能。服务器返回数据由于外界没有该对称密钥,所以无法解密数据。
以上是关于https如何建立安全连接的过程,如何通过安全连接发送数据。而在https的过程中,通过TSL/SSL进行数据加密,TSL/SSL的握手过程又是怎样的呢,如何通过TSL/SSL达成密钥一致?
TLS握手协议
在TLS连接建立之前需要进行的握手过程,根据需要验证的身份信息不同,握手的步骤也会有一些不同。
不需要验证的客户端与需要验证身份的服务器端
- 客户端向服务器端发送自身支持的功能与首选项。
- 服务器端选择连接参数。
- 服务器端发送证书(验证身份)。
- 服务器端发送生成主密钥的额外信息。
- 服务器通知客户端完成协商过程。
- 客户端发送生成主密钥的额外信息。
- 客户端切换加密方式并通知服务器。
- 客户端计算发送和接收到的握手消息的MAC并发送。
- 服务器切换加密方式并通知客户端。
- 服务器切换计算发送和接收到的握手消息的MAC并发送。