本文主要是介绍https建立连接原理笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
建立https连接
- TCP协议–通信双方通过三次握手建立tcp连接
- TLS(transport layer security)协议–通信双方通过四次握手建立TLS连接
- HTTP协议–client向server发起request,server发挥response
PS:以下笔记只针对tls1.2
TCP
tcp三次握手建立连接
- 客户端向服务端发送带有 SYN 的数据段以及客户端开始发送数据段(Segment)的初始序列号 SEQ = 100
- 服务端收到数据段时,向客户端发送带有 SYN 和 ACK 的数据段;
- 通过返回 ACK = 101 确认客户端数据段的初始序列号;
- 通过发送 SEQ = 300 通知客户端,服务端开始发送数据段的初始序列号
- 客户端向服务端发送带有 ACK 的数据段,确认服务端的初始序列号,其中包含 ACK = 301
TCP 连接的双方会通过三次握手确定 TCP 连接的初始序列号、窗口大小以及最大数据段,这样通信双方就能利用连接中的初始序列号保证双方数据段的不重不漏、通过窗口大小控制流量并使用最大数据段避免 IP 协议对数据包的分片
TCP快启 TFO TCP Fast Open(用于重连)
TCP 快启策略使用存储在客户端的 TFO Cookie 与服务端快速建立连接。TCP 连接的客户端向服务端发送 SYN 消息时会携带快启选项,服务端会生成一个 Cookie 并将其发送至客户端,客户端会缓存该 Cookie,当其与服务端重新建立连接时,它会使用存储的 Cookie 直接建立 TCP 连接,服务端验证 Cookie 后会向客户端发送 SYN 和 ACK 并开始传输数据,这也就能减少通信的次数。
TLS
通过 TLS 握手交换双方的密钥
建立连接:
- 客户端向服务端发送 Client Hello 消息,其中携带客户端支持的协议版本、加密算法、压缩算法以及客户端生成的随机数
- 服务端收到客户端支持的协议版本、加密算法等信息后:
- 向客户端发送 Server Hello 消息,并携带选择特定的协议版本、加密方法、会话 ID 以及服务端生成的随机数
- 向客户端发送 Certificate 消息,即服务端的证书链,其中包含证书支持的域名、发行方和有效期等信息
- 向客户端发送 Server Key Exchange 消息,传递公钥以及签名等信息
- 向客户端发送可选的消息 CertificateRequest,验证客户端的证书
- 向客户端发送 Server Hello Done 消息,通知服务端已经发送了全部的相关信息
- 客户端收到服务端的协议版本、加密方法、会话 ID 以及证书等信息后,验证服务端的证书:
- 向服务端发送 Client Key Exchange 消息,包含使用服务端公钥加密后的随机字符串,即预主密钥(Pre Master Secret)
- 向服务端发送 Change Cipher Spec 消息,通知服务端后面的数据段会加密传输
- 向服务端发送 Finished 消息,其中包含加密后的握手信息
- 服务端收到 Change Cipher Spec 和 Finished 消息后
- 向客户端发送 Change Cipher Spec 消息,通知客户端后面的数据段会加密传输
- 向客户端发送 Finished 消息,验证客户端的 Finished 消息并完成 TLS 握手
HTTP
HTTP 协议的数据交换只会消耗 1-RTT,当客户端和服务端仅处理一次 HTTP 请求时,从 HTTP 协议本身我们已经无法进行优化。不过随着请求的数量逐渐增加,HTTP/2 就可以复用已经建立的 TCP 连接减少 TCP 和 TLS 握手带来的额外开销。
总结
当客户端想要通过 HTTPS 请求访问服务端时,整个过程需要经过 7 次握手并消耗 4.5 RTT的延迟。原因:
- TCP 协议需要通过三次握手建立 TCP 连接保证通信的可靠性(1.5-RTT)
- TLS 协议会在 TCP 协议之上通过四次握手建立 TLS 连接保证通信的安全性(2-RTT)
- HTTP 协议会在 TCP 和 TLS 上通过一次往返发送请求并接收响应(1-RTT)
PS:HTTP/3 就是一个这样的例子,它会使用基于 UDP 的 QUIC 协议进行握手,将 TCP 和 TLS 的握手过程结合起来,把 7 次握手减少到了 3 次握手,直接建立了可靠并且安全的传输通道
这篇关于https建立连接原理笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!