Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

HTTPS #23

Open
yunshuipiao opened this issue May 19, 2019 · 0 comments
Open

HTTPS #23

yunshuipiao opened this issue May 19, 2019 · 0 comments
Labels

Comments

@yunshuipiao
Copy link
Owner

yunshuipiao commented May 19, 2019

Https

[TOC]

这篇文章简单介绍一下 https 的工作原理和相关的加密过程

Https 工作原理

https 在传输数据之前需要客户端和服务端之间进行一次握手,在握手过程中确定双方加密传输数据的密码信息。TLS/SSL 协议中使用了非对称加密,对称加密和 hash 算法。具体的过程如下:

  1. 浏览器将自己支持的一套加密规则 发送给服务器
  2. 服务器选出一组加密算法和 Hash 算法,并将自己的身份信息以证书的形式发回浏览器。其证书中包含了网站地址,加密公钥,以及证书的颁发机构等信息
  3. 浏览器获得证书之后:
    1. 验证证书的合法性(颁发证书的机构是否合法,以及包含的地址是否匹配正在访问的地址)。如果证书有效,那么浏览器会显示可信锁头🔒标志
    2. 确认证书有效之后,或者用户接受不受信任的证书,浏览器会生成一串随机数字,并用证书的公钥加密,作为以后通信对称加密的密钥。
    3. 使用约定好的 hash 算法计算握手消息,并用 2 中的随机数对信息进行加密,最后将之前生成的所有信息发送给服务器。
  4. 服务器接收到浏览器发来的数据之后,
    1. 使用自己的私钥解密信息,取出随机数。然后解密浏览器发来的握手信息,并验证 hash 是否一致。
    2. 使用密码加密一段握手消息,发送给浏览器。
  5. 浏览器解密并计算握手消息的 hash, 如果结果一致,则握手过程结束。

Tcp 握手过程和挥手过程

三次握手

  1. 客户端发送一个带有 SYN 标志的 TCP 报文到服务器。这是三次握手过程中的报文1。
  2. 服务器回应客户端报文2,同时带有 ACK 和 SYN 标志。表示 对刚刚客户端 SYN 报文的回应,同时有将 SYN 标志发给客户端,询问是否准备好进行数据通信
  3. 客户端必须再次回应服务端一个 ACK 报文,过程结束。

为什么需要三次握手

解决 网络中存在延迟的重复分组问题。

有这种情况,client 发出的第一个连接请求由于长时间延迟,以致延误到连接释放以后的某个时间段才到达 server 端。因此这是一个失效的报文段

假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”。 主要目的防止server端一直等待,浪费资源。

四次挥手

由于 TCP 连接是全双工的,因此每个方向都需要单独关闭。原则是当一方完成数据发送任务之后,发送 FIN 来终止这个方向的连接。收到一个 FIN 只表示此方向没有数据流动。TCP 连接在收到 FIN 之后仍能发送数据。

  1. TCP 客户端首先发送 FIN, 关闭客户端到服务器的数据传送。
  2. 服务器收到 FIN,返回确认码 ACK, 确认序号为 FIN + 1。
  3. 服务器关闭客户端的连接,发送 FIN 给客户端。
  4. 客户端发会 ACK 报文确认,并将确认序号设置为收到序号 + 1.

因此这里同时也解释为什么需要四次握手:

原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。

TCP 和 UDP 的区别

主要区别在于:

  1. TCP 协议在传输数据段的时候给标号,UDP没有
  2. TCP 协议可靠,而 UDP 协议不可靠
  3. TCP 面向连接,而 UDP 采用无连接
  4. TCP 协议负载较高,采用虚电路
  5. TCP 发送方要要确认接收方是否是否数据段
  6. TCP 采用滑动窗口和流量控制保证数据传输的正确性

@yunshuipiao yunshuipiao changed the title https HTTPS May 20, 2019
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant