Http和Https学习(一)

前言

在实际开发中,部署的项目在服务器上,通过域名来访问,是否会发现有的域名是 http 协议有的是 https 协议。那么同一个网站,他既可以 http 访问,又可以 https 访问,他们是什么呢,他们之间有什么区别呢?

简单介绍下 http 和 https

http 中文名称是超文本网络传输协议,深究一下呢,他是一种分布式、协作式和超媒体信息系统的应用层协议,简单的说就是接受和发送 HTML 页面的方法,用来在 Web 和服务器之间传递信息。

https 是基于 SSL+HTTP 组合而来的,中文名称就是超文本网络传输安全协议,由 Http 通信然后再把信息通过 SSL/TLS 加密。这样的话就能让数据很安全,不会被第三方获取你发了什么信息。

Http 和 Https 的区别

  1. http 默认端口是 80,https 的默认端口是 443
  2. http 不需要 CA 证书,https 需要 CA 证书
  3. http 需要 TCP 握手 3 次,https 的话再 Http 的 3 次握手基础上,还需要 SSL/TLS 的加密握手 9 次,总计 12 次
  4. 从连接的方式上看就知道 http 是明文发送,而 https 是需要加密发送的信息的
  5. 从第三也可知道,http 的速度比 https 的速度快,占用服务器资源少

Http 是怎么进行连接的?

首先,浏览器根据 url 获取域名对应的 IP,如果没有会去 DNS 查找。当拿到服务器 IP 之后,

  • 第一次握手会给服务器发送一个随机值(准确的名称是同步序列值)SYN 包(也可以说是 SYN=1,seq=x,ACK=0),设置发送需要为 X 给服务器。进入 SYN_SEND 状态,等待服务器回应。
  • 第二次握手是服务器拿到之后会确认 ACK=X+1,并且也发送个 SYN 的包,这个包就是(SYN=1,Seq=y,ACK=x+1)给客户端,服务器进入 SYN_RECV 状态。
  • 第三次握手客户端拿到了服务器给的 SYN 包,也就是同步序列包,然后发送确认包 ACK(ack=y+1),大致包的样子就是(Seq=x+1,Ack=y+1)。发送给服务器之后,服务器确认,然后就进入了 ESTABLISHED 状态,,完成了 3 次握手

那么 Https 是怎么工作的呢?

Https 通过上面的 Http 的 3 次握手,之后就进入了 SSL/TLS 的加密握手。

  1. 客户端发送 Url 连接了一下服务器。
  2. 服务器会生成公钥和私钥(公钥和私钥,分别就像一把锁和一把能打开这个锁的钥匙)。
  3. 就会把自己的公钥发送给客户端。
  4. 客户端拿到了公钥(也就是之前提到的 CA 证书),如果没通过就会提示这个网站危险的页面,那么在通过验证的时候会生成一个随机值,那么这个随机值就是客户端的私钥了。
  5. 就会用服务器给的私钥加密随机值发送给服务器。
  6. 服务器拿到了加密数据通过自己的私钥解锁出客户端的随机 key,那么用该 key 来加密要发送的内容。
  7. 发送加密的内容给客户端
  8. 客户端拿到了加密内容,用 key 解密出来。