creed的博客

一次https请求的流程

· zhangwengang

相关名词解释§

https§

对称加密和非对称加密§

证书§

请求的过程§

https的工作模式§

由于对称加密和非对称加密的特点,公钥私钥主要用于传输对称加密的秘钥,而真正的双方大数据量的通信都是通过对称加密进行的,这就是https的总体思路

https 流程§

dns解析成ip地址§
tcp 三次握手§

https的tls 是在可靠的tcp协议上构建安全的传输通道,其本身是不提供可靠性保障的,还是需要下层的传输层,在通信双方建立可靠地tcp连接之后,需要tls握手 来交换对称加密的传输秘钥

  1. client 发送syn,状态由close变成SEND,
  2. server 收到syn,发送syn和syn的ack,变成SYN_RECV
  3. client 收到 后,发送ack,进入establishd状态
  4. 服务端收到后,进入establishd状态,当然服务端这个时候不一定能收到这个ack,但是由于建立连接之后,客户端就会向服务端发送数据,所以当服务端接收到 之后,自然就会进入establishd状态
tls 握手§
  1. tcp握手成功之后,客户端会发送Client Hello消息到服务器,以明文传输TLS版本信息,加密套件候选列表,加密算法候选列表等信息.另外, 还会有一个随机数,在协商对称秘钥的时候使用
  2. 然后网站会返回server Hello,告诉客户端,服务器选择的协议版本,加密套件,加密算法等,同时也返回一个随机数,用于后续的秘钥协商
  3. 然后网站会返回一个服务端的证书,说 Server hello done ,我这里就这些了
  4. 作为客户端肯定不会相信这个证书,于是客户端从自己信任的ca仓库中,拿ca的证书里面的公钥去解密外卖网站的证书.如果能够成功,则说明这个网站是可信的
  5. 证书验证完毕以后之后,觉得这个网站可信,于是客户端计算产生随机数字 pre-master,发送client key exchange ,用证书中的公钥加密,再发给服务器,服务器可以 通过私钥解密出来,到目前为止,无论是客户端还是服务端,都有了三个随机数,自己的,对端的,以及刚生成的Pre-Master随机数.通过这三个随机数,可以在客户端和服务端 之间产生相同的对称秘钥
  6. 此时客户端发送ChangeCipherSpec,指示server从现在开始发送的消息都是加密过的,咱们以后都采用协商的通信密钥和加密算法 进行加密通信了 然后发送一个Encrypted Handshake Message将已经商定好的参数等采用协商密钥进行加密,发送给服务器用于数据与握手验证
  7. 同样,服务器也可以发送 Change Cipher Spec,说:“没问题,咱们以后都采用协商的通信密钥和加密算法进行加密通信了”,并且也发送 Encrypted Handshake Message 的消息试试。 当双方握手结束 之后,就可以通过对称密钥进行加密传输了 tls握手流程图
握手完毕,双方开始正常通信§

传输层->网络层->链路层

断开连接,tcp4次挥手§

当数据传输完毕之后,会进行连接的断开,链接的断开过程称为tcp的4次挥手

  1. A: B啊,我不想玩了
  2. B: 好啊,我知道了
  3. B: a啊,我也不想忘了,拜拜
  1. A: 好的,我知道了,拜拜 tcp4次挥手流程图

  2. client 发送FIN,seq=q, 进入FIN_WAIT_1状态

  3. server 端回复ACK,ack=q+1,进入close_wait状态

  4. client 收到ACK,进入FIN-wait_2状态

    • 如果这个时候服务端跑路了,那么client永远会停留在这个状态,tcp协议没有对这个状态做处理,但是linux有,可以设置一个超时时间
  5. server端发送FIN,ACK通知client,进入LAST_ACK状态

  6. client端收到后回复ACK,进入time_wait状态(最多等待2msl,等待之前的包传输完),后变成closed

  7. server端收到ack,进入closed状态