这是我参与第五届青训营伴学笔记创作活动的第三天,
http相关
三次握手
第一次客户端向服务端发送初始序列号,第二次服务端向客户端发送表示接受到了然后回复我成功接受到了,第三次客户端向服务端发送表示客户端对于服务端初始序号的确认。
为什么需要三次握手
防止重复连接,如果网络较差的情况下第一次连接较后到达,第三次握手能判断是否是历史遗留的连接,从而决定是否终止连接。
确定可靠的初始化序列号,如上两段所示。
四次挥手
第一次客户端发送关闭的请求,第二次服务端回复知道了,此时不再接收客户端的信息,但是此时还有信息未传输完成,等到信息传输完成后,发送第三次请求说明我也想关闭了,第四次时客户端收到释放请求后,发送确认应答。
https
https相对于http多了一个s
,这个s
代表的是SSL
和TLS
,在tcp
握手以后,还要进行TLS
握手,才可以开始通信。
TLS
的握手过程
一共四个回合
1.客户端发出请求(Client Hello)
- 支持的协议版本,比如TLS 1.0版
- 一个客户端生成的随机数,稍后用于生成"会话密钥"
- 支持的密码套件(支持的加密方法)
2.服务器回应(Server Hello + Server Certificate+ ServerKeyExchange+ServerHelloDone)
-
确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
-
一个服务器生成的随机数,稍后用于生成"会话密钥"
-
确认使用的加密方法,比如RSA公钥加密(确认密码套件)
-
服务器证书(CA 证书,在Certificate阶段发送,证书中包含服务器的公钥)
-
Server Hello Done 服务器发送完上述信息后,会立刻发送该信息,然后等到客户端的回应
3.客户端回应(ClientKeyExchange+ ChangeCiperSpec + Finished)
客户端收到服务器回应以后,开始走证书链逐级验证,确认证书的真实性,如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书真实有效,从证书中拿出服务器公钥,向服务器发送下面三项信息:
- 一个用服务器公钥加密随机数(pre-master key),防止被窃听
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(Change Cipher Spec)
- 客户端握手结束通知(Finished),表示客户端的握手阶段已经结束。这一项是把之前所有发送的数据做个摘要(hash值),再加密一下,供服务器校验
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。
4.服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。
然后,向客户端最后发送下面信息:
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(Change Cipher Spec)
- 服务端握手结束通知(Finished),表示服务端的握手阶段已经结束。这一项是把之前所有发送的数据做个摘要(hash值),再加密一下,供客户端校验
TLS握手结束后,双方开始使用对称会话密钥进行加密通信。