TCP HTTP TLS

TCP 传输层协议

TCP 三次握手: x , y 为随机生成的序号

  • 客A主动发起一个连接请求,即 SYN=1,同时带上一个随机生成的序号×,即 seq=x。
  • 服B在收到请求后进行响应,也将 SYN设为1,同时确认客A的请求有效,即 ACK=1,ack=x+1,将自己随机生成的序号y也传给客A, 即 seq=y.
  • 客A在收到服B的响应后作出反应,确认有效即 ACK=1,ack=y+1,seq=x+1(因为客A中间没有再向服B发送数据所以x没有改变)。
  • 客A和服B进行数据传输。

为什么要三次握手: 因为三次握手是保证client和server端均让对方知道自己具备发送和接收能力的最小次数。

为什么每次还要发送SYN或者ACK?

为了保证每一次的握手都是对上一次握手的应答,每次握手都会带一个标识 seq,后续的 ack 都会对这个 seq 进行+1来进行确认。也就是保证每次的握手双方都是同一个对象,防止中途被替换了。

四次挥手:

  • 客A主动发起关闭,即 FIN=1,同时带上随机生成的随机数u,即 seq=u。
  • 服B收到请求后进行响应,确认请求有效,即ACK=1,ack=u+1,同时带上自己生成的随机数V,即 seq=V。此时服B并没有完全关闭,而是处于半关闭的状态,仍旧能够向客A发生未发送完的数据。
  • 当服B把需要发送的数据发送完后就进行剩下的关闭请求操作,即 FIN=1,ACK=1,ack=u+1,因为处于半关闭状态的服B可能对客A发送了数据,所以序号不确定,即 seq=W。
  • 客A收到服B的信息后作出响应,即 ACK=1,ack=w+1,因为中间客A没有再进行数据传输所以u不变,即 seq=u+1。
  • 客A等待一段时间后完成挥手。

HTTPS 连接建立

首先TCP 三次握手建立连接 然后 ssl/tls 建立连接

  • 浏览器向服务器发起加密请求,同时传送浏览器支持的协议版本,浏览器随机生成的随机数random1,以及支持的加密方法。
  • 服务器收到请求后在获取到的协议版本中选择自己也支持的版本,例如:TLS1.2,选定同样支持的加密方式,例如:RSA,连同目己生成随机数random2和服务器数字证书一起传给浏览器。
  • 浏览器收到数字证书后并确认证书合法,使用证书中的公钥加密浏览器随机生成的随机数random3。此时浏览器已经有三个随机数: random1,random2和random3,三个随机数生成此次的会话秘钥。将之前握手的消息生成摘要,然后用生成的会话秘钥加密,然后将被公钥加密的随机数random3,被会话秘钥加密的摘要发送给服务器,同时进行编码变更,告知浏览器端的握手过程已经结束,随后的信息交流都使用各自生成的会话秘钥进行加密交流。
  • 服务器收到消息后,使用私钥进行random3的解密,获取第三个随机数,然后也生成此次的会话秘钥,使用会话秘钥对加密的摘要信息进行解密,证明双方生成的会话秘钥是一致的。再将之前的握手信息也生成摘要,使用自己生成的会话秘钥进行加密,将加密的摘要发送给浏览器,同时编码变更以及完成服务器端的握手过程。
  • 浏览器接收到加密的摘要后,使用会话秘钥进行解密,确保双方生成的会话秘钥是一致的。
  • 接下来就是使用各自生成的会话秘钥进行对称加密的数据传输

TLS 1.3

TLS 1.3 是最新版传输层安全协议 (TLS),即 HTTPS 使用的加密协议。与 TLS 1.2 相比,TLS 1.3 可提供更好的隐私保护和性能。

TLS 1.3 将 TLS 握手从两次往返缩短为一次。对于使用 HTTP/1 或 HTTP/2 的连接,将 TLS 握手时间缩短为一次往返,可有效将连接设置时间缩短 33%。

HTTP/2 和 HTTP/3

与 HTTP/1 相比,HTTP/2 和 HTTP/3 都提供性能优势。在两者中,HTTP/3 具有更大的潜在性能优势。HTTP/3 尚未完全标准化,但一旦发生这种情况,就会受到广泛支持

HTTP/2

HTTP/3

HTTP/3 是 HTTP/2 的继任者。截至 2020 年 9 月,所有主流浏览器均提供对 HTTP/3 的实验性支持,部分 CDN 支持 HTTP/3。性能是 HTTP/3 优于 HTTP/2 的主要优势。具体来说,HTTP/3 消除了连接级别的队头屏蔽问题,缩短了连接设置时间。

消除队头屏蔽

HTTP/2 引入了多路复用功能,该功能允许使用单个连接同时传输多个数据流。然而,使用 HTTP/2 时,一个丢弃的数据包会阻止连接上的所有数据流(这种现象称为队头阻塞)。使用 HTTP/3 时,丢弃的数据包仅阻塞单个数据流。这一改进主要是 HTTP/3 使用 UDP(HTTP/3 通过 QUIC 使用 UDP)而非 TCP 的结果。这使得 HTTP/3 对通过拥塞或有损网络进行的数据传输尤其有用。

SSO

什么是单点登录

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的

什么是CAS

简单来说,SSO仅仅是一种架构设计思想,而CAS 则是实现 SSO 的一种手段。两者是抽象与具体的关系。当然,除了 CAS 之外,实现 SSO 还有其他手段,比如简单的 cookie。

CAS (Central Authentication Service)是耶鲁 Yale 大学发起的一个java开源项目,旨在为 Web应用系统提供一种可靠的 单点登录 解决方案(Web SSO),CAS 具有以下特点:

  • 开源的企业级单点登录解决方案;
  • CAS Server 为需要独立部署的Web 应用,一个独立的Web应用程序(cas.war)。;
  • CAS Client 支持非常多的客户端(指单点登录系统中的各个 Web 应用),包括 Java,.Net, PHP, Perl,等

单点登录的演进

同域

同域,一般情况下是最简单的一种,一般使用cookie、session的方式就可以解决,这里我们强调一下cookie是不可以跨域的

同父域

同父域 SSO 是同域 SSO 的简单升级,唯一的不同在于,服务器在返回cookie的时候,要把cookie的domain设置为其父域。

举个栗子,http://ww.xxxx.aaa.com和http://ww.xxxx.bbb.com。他们的父域名是http://www.xxxx.com,因此将cookie的domain设置为http://www.xxxx.com即可。

3. 跨域CAS

CAS术语

  • Client:用户。
  • Server:中心服务器,也是 SSO 中负责单点登录的服务器。
  • Service:需要使用单点登录的各个服务,相当于上文中的产品 a/b。

接口:

  • /login:登录接口,用于登录到中心服务器。
  • /logout:登出接口,用于从中心服务器登出。
  • /validate:用于验证用户是否登录中心服务器。
  • /serviceValidate:用于让各个 service 验证用户是否登录中心服务器。

票据

TGT: Ticket Grangting Ticket

TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在 CAS 成功登录过。TGT 封装了 Cookie 值以及此 Cookie 值对应的用户信息。当 HTTP 请求到来时,CAS 以此 Cookie 值 (TGC)为key 查询缓存中有无 TGT,如果有的话,则相信用户已登录过。

TGC: Ticket Granting Cookie

CAS Server 生成TGT放入自己的 Session 中,而 TGC 就是这个 Session 的唯一标识(Sessionld),以Cookie 形式放到浏览器端,是 CAS Server 用来明确用户身份的凭证。

ST: Service Ticket

ST是CAS 为用户签发的访问某一service 的票据。用户访问 service 时,service 发现用户没有ST,则要求用户去 CAS获取 ST。用户向CAS 发出获取 ST 的请求,CAS 发现用户有 TGT,则签发一个ST,返回给用户。用户拿着 ST 去访问 service,service 拿ST 去CAS 验证,验证通过后,允许用户访问资源。