HTTPS和TCP协议三次握手设计
1. 我们的TCP 三次握手大概是长这样

2.那么为什么 TCP 要采取三次握手,而不是两次或其他
首先我们要知道握手的目的:
- 为了保证通讯双方建立的连接是可靠的。
- 同时,为了保证性能,握手的次数要求尽可能少。
那么什么才算是连接可靠?
- 通讯双方建立的连接可靠”就是要确保双方的发送和接收功能都正常。
以下图为例,在握手前,双方的发送和接收能力尚未确认。
第一次握手:
客户端向服务端发送信息。当服务端接收到信息后,服务端可以明确接收功能是正常的。

第二次握手:
服务端向客户端发送信息作为应答。当客户端接收到信息后,客户端可以明确发送和接受功能都正常。

第三次握手:
客户端向服务端发送信息,当服务端接收到信息后,服务端可以明确发送功能是正常的。

通过三次握手,就能明确双方的收发功能均正常,也就是说,保证了建立的连接是可靠的。而且,由上可见,三次是确保连接可靠的最少次数,再就多余。

3.都知道HTTPS是比HTTP更安全的连接方式,但为什么HTTPS会更安全?
- 因为HTTPS加入了SSL所以更安全,但为什么是SSL?
3.1我们先了解一下什么事对称加密,给大家讲一个故事。
古时候有两个人,一直通过写信相互联系

但他们总觉得邮差的样子很贼,害怕自己信件被偷看。
于是一次见面的时候,找来一个带锁的盒子和两把钥匙,商定每次寄信前都先锁上信件。

通过这种方式,他们觉得通信已经足够安全了。
直到有一天,其中一个人把钥匙弄丢了。
他想要发信通知另一人拷贝一把钥匙发回来,但深想,他没法将“拷贝一把新钥匙给我”这番话进行加密,也没法保证中途钥匙会不会被盗窃啊。
换言之,要继续维持原来的通信方式,只能约对方出来见面再拿新的钥匙了。
如果将这个问题放到当今的互联网,通讯前都要求两个人先见面取钥匙,那显然是不可能的。
于是有了非对称加密
3.2非对称加密
针对于上述钥匙交换的问题,人们想出了非对称加密的方式,简单来说,非对称加密有公钥和密钥,公钥可以公开由任何人持有,而私钥由自己持有。公钥加密的信息只能由对应的私密解密,同样,私钥加密的信息只能由对应的公钥解密。
利用这个特性,回到上面的例子,可以进行下面的通信方式:
1. 先将公钥交给邮差发送给对方
2. 对方使用公钥将信息加密之后将信息返回

3. 收到信件后,利用私钥对信息进行解密

这样就能保证信件的保密传递了。
而由于公钥是允许任何人知道的,如果用私钥将信息加密,被别人窃取后,可以通过公开的公钥来获取信息,所以通信前一定是先获取对方的公钥,只传递公钥加密后的信息。
这样足够安全了吗?并不。
如果有人截取通信,伪装成其中一方,发送伪造方的公钥,就能窃取通讯信息了。

认证机构和数字证书
为了保证通信者获取的公钥并没有被恶意替换,可以通过第三方认证机构来确认公钥是否可信。
那么这个认证和检验的过程是怎样实现的呢?
首先,通信的一方需要先向认证机构认证自己的身份。将自己的通讯公钥和一些个人信息发送给认证结构,然后认证机构利用自己的私钥来对这些信息加密,生成一份数字证书,这份证书就是用来证明这个人的身份的。

在浏览器中,系统默认就会装有一些认证机构的公钥,称之为顶级证书。
在通讯的时候,先发送数字证书,然后接收方利用顶级证书对这份数字证书进行解密,获得通讯的另一方的公钥,同时利用解密出来的信息进行比对,从而检验出解析出来的公钥是否属于通讯方。
流程如下:

这样,如果顶级证书没有被恶意替换,整个通讯流程就可以认为是安全的。
3.3优化通讯性能
再回顾上面的流程,
对称加密的弊端是难以安全地传递密钥。
非对称加密的弊端是加密和解密的花费时间长,如果通讯中所有数据都使用非对称加密,将会引起性能问题。
如果结合两者,使用机构认证和非对称加密的方式解决密钥传递的问题,使用对称加密的方式来解决加解密费时问题,就能达到性能优化的目的。
如果通讯双方分别是浏览器和服务器,通讯流程将如下:
1. 服务器先从认证机构申请数字证书

2. 浏览器访问网站,服务器返回数字证书

3.1. 浏览器利用内置的顶级证书解析服务器返回的数字证书得到服务器的公钥。
3.2. 然后浏览器生成一个对称加密的密钥。
3.3. 再利用服务器的公钥进行加密。

浏览器将加密后的密钥发送给服务器,服务器利用自己的私钥将其解密得到对称加密的密钥,双方将使用该对称加密的密钥进行通讯。

以上~
HTTPS和TCP协议三次握手设计的更多相关文章
- TCP 协议三次握手过程分析
TCP 协议三次握手过程分析 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...
- TCP协议三次握手
TCP协议三次握手过程分析 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...
- TCP协议三次握手和四次挥手
http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...
- TCP协议三次握手与四次挥手通俗解析
TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字 ...
- TCP协议—三次握手四次挥手的原理<转>
三次握手四次挥手的原理 TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三 ...
- TCP协议“三次握手”与“四次挥手”详解(上)
在使用TCP协议进行数据的传输之前,客户端与服务器端需要建立TCP Connection,即建立连接,之后两端才能进行数据的传输. 下面堆TCP连接“三次握手”的过程进行说明. 1.相关概念 首先,我 ...
- TCP协议三次握手过程分析【图解,简单清晰】
转自:http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是 ...
- TCP 协议三次握手过程解析带实例
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- TCP协议三次握手过程分析
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
随机推荐
- java深入浅出之数据结构
1.整形数据 byte.short.int.long,分别是1248个字节的存储量,取值范围也是依次增大的,其中int是正负21亿多: long a = 1111222233334444L:记住后面要 ...
- SpringBoot Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.
使用SpringBoot写HelloWorld,当配置好启动类后,再创建新的controller或其它类,启动项目后访问对应的映射名,页面显示: Whitelabel Error Page This ...
- 浅谈编程语言中的新宠Python,你叫它如何不火?
论述 凡是对编程有所关注的朋友都已经知道,Python公布于1991年,即使出现的时间不是很遥远,但是在众多爱好者的贡献下已经发展到全民Python的地步. Python最近火起来的笼统原因:面向企业 ...
- Python学习 Part5:输入输出
Python学习 Part5:输入输出 1. 格式化输出 三种输出值的方法: 表达式语句 print()函数 使用文件对象的write()方法 两种方式格式化输出: 由自己处理整个字符串,通过使用字符 ...
- Spring Aop技术原理分析
本篇文章从Aop xml元素的解析开始,分析了Aop在Spring中所使用到的技术.包括Aop各元素在容器中的表示方式.Aop自动代理的技术.代理对象的生成及Aop拦截链的调用等等.将这些技术串联起来 ...
- 用Promise实现:带延时功能的链式调用
// 1) 调用方式 new People('whr').sleep(3).eat('apple').sleep(5).eat('durian'); // 2) 打印结果 'hello, whr' - ...
- http响应结构分析
HTTP响应由三个部分组成: 1.状态码(Status Code): 描述了响应的状态.可以用来检查是否成功的完成了请求.请求失败的情况下,状态码可用来找出失败的原因.如果Servlet没有返回状态码 ...
- Java中创建线程的三种方式及其优缺点
1.自定义一个继承Thread的类,由于Java的单继承特性,限制了该类的扩展性. 2.实现Runnable接口,重写run()方法. 3.实现Callable接口,重写call方法.线程执行体可以有 ...
- 自动化测试--protractor
前戏 面向模型编程: 测试驱动开发: 先保障交互逻辑,再调整细节.---by 雪狼. 为什么要自动化测试? 1,提高产出质量. 2,减少重构时的痛.反正我最近重构多了,痛苦经历多了. 3,便于新人接手 ...
- 基于微服务API级权限的技术架构
一般而言,企业内部一套成熟的权限系统,都是基于角色(Role)的 访问控制方法(RBAC – Role Based Access Control),即权限 (Permission)与角色相关联,用户( ...