🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
![](https://img.kancloud.cn/bc/f3/bcf3aebdebe907f2ad71dd42f90ca14a_640x501.png) 当建立协议的时候,tcp进行了3次握手: 1、客户端发送了一个带有SYN的Tcp报文到服务器,这个三次握手中的开始。表示客户端想要和服务端建立连接。 主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机。 2、服务端接收到客户端的请求,返回客户端报文,这个报文带有SYN和ACK标志,询问客户端是否准备好。 主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包。 3、客户端再次响应服务端一个ACK,表示我已经准备好。主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。 当终止协议的时候,tcp进行了4次握手: 由于Tcp连接是进行全双工工作的,因此每个方向都必须单独进行关闭,这个原则是当一方完成他的数据发送的时候就发送一个FIN来终止这个方向的连接,收到这个FIN意味着这个方向上没有数据的流动,一个TCP连接在收到这个FIN之后还能发送消息,首先执行关闭的一方进行主动的关闭,而另一方进行被动的关闭。 1、TCP发送一个FIN,用来关闭客户到服务端的连接。2、服务端收到这个FIN,他发回一个ACK,确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。3、服务端发送一个FIN到客户端,服务端关闭客户端的连接。4、客户端发送ACK报文确认,并将确认的序号+1,这样关闭完成。 ![](https://img.kancloud.cn/d4/90/d490a8d38c3469a995c7e1fa7d78dbe0_1012x2516.png)、 第一次握手(Client Hello) ![](https://img.kancloud.cn/c6/da/c6da2f3e367546b709774a4b569fa0de_910x688.png) 第二次握手(Server Hello) ![](https://img.kancloud.cn/9a/d5/9ad5ff5e84c3304a4dbd0a9f9c198874_849x410.png) ![](https://img.kancloud.cn/9e/5e/9e5e2a7d8f7abc4d21d4eec0d48be9f4_789x287.png) ![](https://img.kancloud.cn/48/b6/48b633ec3097869c571fffd55218eb65_880x518.png) 第三次握手 ![](https://img.kancloud.cn/4c/7a/4c7af42df2577a9ca8ff07920ecdfacb_897x437.png) Change Cipher Spec:表示自己已经生成了新的秘钥,并且告知对方,以后就用新的秘钥通信。 Encrypted Handshake Message: 用新秘钥加密规定好的测试信息传输给对方,用于验证双方新的秘钥是否一致。 第四次握手 ![](https://img.kancloud.cn/e8/dc/e8dc5611c7dc32de1732c5c061ad6081_924x467.png) Change Cipher Spec:表示自己已经生成了新的秘钥,并且告知对方,以后就用新的秘钥通信。 Encrypted Handshake Message: 用新秘钥加密规定好的测试信息传输给对方,用于验证双方新的秘钥是否一致。 New Session Ticket:用于刚刚建立的会话,在接下来的一段时间,双方都以刚刚交换的秘钥进行通信。 总结:运行在SSL/TLS上的HTTP就是HTTPS。 ![](https://img.kancloud.cn/d9/4e/d94ecfab6172c6877a771068fcaff01c_1075x795.png)1. 客户端请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。 2. 服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。 3. 客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器。 4. 服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key。 此后的HTTP链接数据传输即通过对称加密方式进行加密传输。 HTTPS的工作原理 ![](https://img.kancloud.cn/0a/00/0a0094b35885d7a83f782869998ba86e_600x135.png) 1. 客户端发起HTTPS请求 这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。 2. 服务端的配置 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。 这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。 3. 传送证书 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。 4. 客户端解析证书 这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。 如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。 5. 传送加密信息 这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。 6. 服务段解密信息 服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。 7. 传输加密后的信息 这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。 8. 客户端解密信息 客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策