为什么要进行三次握手?
第一次握手是客户端向服务端发消息,询问你有没有接收消息的能力?确保消息能准确发送出去,告诉服务端我有写的能力;第二次握手是指服务端向客户端回消息,标明我收到了消息并且能给你反馈,也就是服务端有读和写的能力;第三次握手是客户端给服务端发消息确认建立连接,是告诉服务端我不仅有写的能力,而且我也有读的能力,咱们可以放心通讯了。
前三步TCP连接即三次握手的过程:
第一次握手数据包:客户端发送一个TCP,标志位为SYN,序列号为0,代表客户端请求建立连接。
第二次握手数据包:服务器发回确信信息包,标志位为SYN,ACK,将确认序号设置为请求信号加1,即0+1=1。
第三次握手数据包:客户端再次发送确认包(ACK),标志位为SYN、ACK的序号都为1。
至此三次握手建立成功。
从第四步是SSL/TLS建立的过程:
1、ClientHello:这条消息将客户端的功能和首选项传送给服务器。包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
2、ServerHello:消息将服务器选择的连接参数传送回客户端。将ClientHello发送过来的信息通过筛选,选择同一的加密组件等信息。目的是统一双方的加密套件。
3、Certificate:服务将证书回传客户端。
4、ServerKeyExchange:消息的目的是携带密钥交换的额外数据。消息内容对于不同的协商算法套件都会存在差异。在某些场景中,服务器不需要发送任何内容,在这些场景中就不需要发送ServerKeyExchange消息。
5、ServerHelloDone:消息表明服务器已经将所有预计的握手消息发送完毕。在此之后,服务器会等待客户端发送消息。
6、ClientKeyExchange:消息携带客户端为密钥交换提供的所有信息。这个消息受协商的密码套件的影响,内容随着不同的协商密码套件而不同。
7、ChangeCipherSpec:消息表明发送端已取得用以生成连接参数的足够信息,已生成加密密钥,并且将切换到加密模式。客户端和服务器在条件成熟时都会发送这个消息。注意:ChangeCipherSpec不属于握手消息,它是另一种协议,只有一条消息,作为它的子协议进行实现。
8、Encrypted handshake message:这个报文的目的就是告诉对端自己在整个握手过程中收到了什么数据,发送了什么数据。来保证中间没人篡改报文。其次,这个报文作用就是确认秘钥的正确性。因为Encrypted handshake message是使用对称秘钥进行加密的第一个报文,如果这个报文加解密校验成功,那么就说明对称秘钥是正确的。
建立成功后就是一些https的请求,最后FIN表示断开连接。