分享HTTPS之前,先简单分享一下其他几个概念
TCP
传输控制协议,是一种面向连接的,可靠的运输层协议。
双方建立了TCP协议后就可以传输数据。
建立TCP连接需要进行三次握手,简单来说就是下面这样:
- 发起方(一般是客户端)发送SYN报文给服务端,然后进入SYN_SEND状态
- 服务端收到SYN报文后,回应一个SYN+ACK报文,进入SYN_RECV状态
- 客户端收到SYN报文后,回应一个ACK报文,进入Established状态
这样三次握手就完成后连接就建立了,可以开始传输数据
Socket
套接字,它不是一种协议,是对TCP或者UDP的封装,可以理解为一种接口。
通过它可以发送或接收数据。一般通过socket建立的连接,除非一端主动断开,否则会长久保持这个连接,常常用来做IM通信使用。
HTTP协议
超文本传输协议,是一种应用层协议。它基于TCP建立通信连接,然后发起HTTP请求。
一次完整的HTTP请求如下:
- 客户端根据请求域名,利用DNS域名解析服务去获取对应的IP地址(如果本身使用的就是ip地址,就省去这一步)
- 根据IP地址等信息去建立TCP连接
- 建立连接后,发起HTTP请求
- 服务端响应HTTP请求,将数据返回给客户端
HTTP协议是“请求-响应”的模式。按照正常情况下,服务端返回给客户端数据后就会关闭TCP连接。
但是HTTP1.1版本,为了提高传输效率,会通过keep-alive字段来告诉服务端不要关闭连接,客户端会将这个tcp连接放入池子中等待复用,省去了再次建立TCP的过程,但是还有一点弊端,就是一次只能处理一个连接,在上一次请求没有完成前,都需要等待,而且每次新请求都建立一个tcp连接,池子中的tcp连接过多会对服务端资源产生较大浪费。
HTTP2.0版本解决了上面的问题,实现了可以多路复用解决上面的问题。可以实现多个请求同时在这个tcp连接上进行。实现原理是:将数据分成了多个stream,每个stream都有标识可以知道是哪个连接请求的,因此多个请求可以同时在这个TCP上进行数据传递。
SSL/TLS
安全套阶层。SSL是早期的版本,TLS是标准化后的版本,可以理解为一个东西不同时期的叫法。
个人理解,主要是用来协商如何加密的。
- 客户端发送支持的加密协议以及版本等等信息
- 服务端根据这些信息,选择合适的加密协议,返回SSL证书等
- 客户端通过系统内置的CA受信任列表来验证SSL证书的合法性
- 客户端生成对称密钥,通过证书中的公钥加密,发给服务端
- 服务端用私钥解密,获取对称密钥,使用密钥加密数据告诉客户端“好的”
- 客户端使用对称密钥加密数据开始进行HTTP请求
……
HTTPS
和上面的HTTP相比,多了一个S。
其实HTTPS就相当于HTTP+SSL/TLS
- 为什么要加一个SSL?
因为HTTP协议实在太不安全了,已经远远不能满足人们的需求。
首先,HTTP是明文传输,大多数人利用工具就可以进行抓包截取,你的所有信息几乎裸露给了其他人。
其次,它很容易受到中间人攻击。不法分子可以截断你和服务器的交流,自己伪装成服务器进行不法事情。
一次完整的HTTPS请求如下:
- 客户端根据请求域名,利用DNS域名解析服务去获取对应的IP地址(如果本身使用的就是ip地址,就省去这一步)
- 根据IP地址等信息去建立TCP连接
- 建立连接后,开始协商如何加密
- 协商加密完成后,开始加密数据进行HTTP请求
- 服务端收到请求,将数据进行加密后返回
参考地址:
http://www.httpclient.cn/category/https/
https://blog.51cto.com/11883699/2160032
网友评论