\
报文交互流程图:
1. 客户端发送client_hello报文,其cookie字段的值为空,报文段的内容除cookie外,还有客户机产生的32字节的随机数,其中前4字节为时间戳,后28字节为系统产生的随机数。此外,该报文段的内容还有客户机支持的加密方式(PSK或者ECC)和压缩方式,供服务器进行选择。
2. 服务受到cookie报文后,回应hello_verify_request,为cookie赋值。Cookie的值为根据client请求的源地址哈希得到。
3. Client再次发送clienthello报文,这次发送的报文中,cookie字段为server端的赋值。
4. Server端收到带有cookie的client hello,对其验证,如何与本地保存的一致,则继续握手;若不是,则拒绝建立连接。此举是为了减少放大攻击。
5. Server向client发送证书、server_key_exchange报文,在服务器发给客户机的证书报文段中,包含有服务器证书的公钥;客户机接收到该报文段后,按照协议规定,从报文段的对应位置中读取出服务器证书的公钥存入相关变量中。
6. Client在接收到Server的证书信息后进行验证,并向Server发送证书信息,由Server端进行验证。
7. 双方信息验证通过后,Client向Server发送CCS报文,该报文记录了会话需要的,加密、压缩算法等信息;并发送finished报文,finished报文是利用前期会话协商得到的会话秘钥,对client的mac地址进行加密传输。
8. Server收到CCS报文后,回应CCS报文给客户端,利用会话秘钥对client发送过来的finished报文进行解密,如果解密成功,则给客户端回应finished报文,握手流程结束;如果Server对Client的finished报文解析失败,则发送握手失败消息。