前端须要关注的几种“握手”

前言

失业期间闲来无事,看了本《网络是怎样链接的》与两本HTTP相关的专栏。html

一方面补充专业知识,另外一方面也是为了跳槽面试作准备。前端

避免看了即忘,就画了一张XMind图:git

值得深刻的问题太多了,今儿就先来说讲: Web中的几种“握手”github

1. 不止一种握手

在早期的网络传输中,也就存在TCP协议须要“握手”的过程,但早期的协议有一个缺陷:通讯只能由客户端发起,作不到服务器主动向客户端推送信息。web

因而WebSocket 协议在2008年诞生,2011年成为国际标准。全部浏览器都已经支持了。 面试

而随着SSL/TLS的完善,存在已久的安全版网络协议:HTTPS也是迸发式发展。设计模式

最后前端领域的协议握手便成了三分天下:浏览器

  1. TCP三次握手,归HTTP
  2. TLS握手,归HTTPS
  3. WebSocket握手,基于TCP协议,都能用。

2. TCP三次握手的终极意义

在我以前的文章:[《「真香警告」重学 TCP/IP 协议 与三次握手
》](https://juejin.im/post/5ca95e...安全

也详细的讲述过TCP三次握手,但那时我未明确意识到其深入含义。服务器

就和你们同样,只在面试前会记得,事后即忘。

直到我看到《网络是怎样链接的》中的一段话:

**在实际的通讯中,序号并非从 1 开始的,而是须要用随机数计算出一个初始值,这是由于
若是序号都从 1 开始,通讯过程就会很是容易预测,有人会利用这一点来发动攻击。 <br/><br/>可是若是初始值是随机的,那么对方就搞不清楚序号究竟是从
多少开始计算的,所以须要在开始收发数据以前将初始值告知通讯对象。**

你品,你细品。三次握手不就是相互试探暗号,来肯定是否是对的人吗?

2.1 知识补充:一个网络包的最大长度

计算每一个网络包能容纳的数据长度,协议栈会根据一个叫做 MTU的参数来进行判断。

MTU表示一个网络包的最大长度,在以太网中通常是1500字节

MTU是包含头部的总长度,所以须要从MTU减去头部的长度,而后获得的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫做MSS

由上两图可知,MSS值是1460(1500-40)字节,其中:

  1. TCP固定头部20字节。
  2. IP固定头部20字节。
  3. TCP头部最长能够达到60字节。

3. TLS握手:HTTPS的核心

HTTPS 实际上是一个“很是简单”的协议, RFC 文档很小,只有短短的 7 页,里面规定了新的协议名“ https”,默认端口号 443,至于其余的什么请求 - 应答模式、报文结构、请求方法、 URI、头字段、链接管理等等都彻底沿用 HTTP,没有任何新的东西。---- 《透视 HTTP协议》

感兴趣的能够到这里看看:连接:https://tools.ietf.org/html/r...

3.1 TLS/SSL到底是啥?

不少人看到TLS/SSL这对词就开始蒙圈了。实际上,这两个东西是一个玩意儿:

1999 年更名:SSL 3 === TLS 1.0

目前运用最普遍的是TLS 1.2:

TLS 由记录协议、握手协议、警告协议、变动密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。

因为TLS/SSL 协议位于应用层和传输层 TCP 协议之间。TLS 粗略的划分又能够分为 2 层:

  1. 靠近应用层的握手协议 TLS Handshaking Protocols
  2. 靠近 TCP 的记录层协议 TLS Record Protocol

这个篇幅展开来写就太多了,咱们先关心下TLS握手吧。

3.2 TLS握手详解

TLS握手什么时候发生?:

  1. 每当用户经过HTTPS导航到网站而且浏览器首先开始查询网站的原始服务器时,就会进行TLS握手。
  2. 每当其余任何通讯使用HTTPS(包括API调用和HTTPS查询上的DNS)时,也会发生TLS握手。
  3. 经过TCP握手打开TCP链接后,会发生TLS 握手。

TLS握手期间会发生什么?

TLS握手过程当中,客户端和服务器将共同执行如下操做:

  • 指定将使用的TLS版本(TLS 1.0、1.二、1.3等)
  • 肯定将使用哪些加密套件。
  • 经过服务器的公钥和SSL证书颁发机构的数字签名来验证服务器的身份
  • 握手完成后,生成会话密钥以使用对称加密

加密套件决定握手方式:

摘自:《HTTPS篇之SSL握手过程详解》
TLS中有两种主要的握手类型:一种基于 RSA,一种基于 Diffie-Hellman。 这两种握手类型的主要区别在于主秘钥交换和认证上。
秘钥交换 身份验证
RSA握手 RSA RSA
DH握手 DH RSA/DSA

主流的握手类型,基本都是基于RSA,因此如下讲解都基于 RSA版握手。

整个流程以下图所示:

具体流程描述:

  1. 客户端hello:客户端经过向服务器发送“问候”消息来发起握手。该消息将包括客户端支持的TLS版本,支持的加密套件以及称为“客户端随机”的随机字节字符串。
  2. 服务器hello:为回复客户端hello消息,服务器发送一条消息,其中包含服务器的SSL证书,服务器选择的加密套件和“服务器随机数”,即服务器生成的另外一个随机字节串。
  3. 客户端发送公钥加密的预主密钥。
  4. 服务器用本身的私钥解密加密的预主密钥。

    • 客户端finished:客户端发送“完成”消息,该消息已用会话密钥加密。
    • 服务器finished:服务器发送一条用会话密钥加密的“完成”消息。
  5. 握手完成,后续经过主密钥加解密。

只有加密套件,讲解的话须要有抓包基础。改天,改天我必定讲。。。

4. WebSocket握手

WebSocket协议实现起来相对简单。它使用HTTP协议进行初始握手。成功握手以后,就创建了链接,WebSocket基本上使用原始TCP读取/写入数据。

《图解HTTP》一书中的图讲的比较清楚:

具体步骤表现是:

  1. 客户端请求:
GET /chat HTTP/1.1     
Host: server.example.com     
Upgrade: websocket     
Connection: Upgrade     
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==     
Sec-WebSocket-Protocol: chat, superchat     
Sec-WebSocket-Version: 13     
Origin: http://example.com
  1. 服务端响应:
HTTP/1.1 101 
Switching Protocols     
Upgrade: websocket     
Connection: Upgrade     
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=     
Sec-WebSocket-Protocol: chat

4.1 Websocket全双工通讯

Websocket协议解决了服务器与客户端全双工通讯的问题。

那什么是单工、半双工、全双工通讯?

类型 能力
单工 信息单向传送
半双工 信息能双向传送,但不能同时双向传送
全双工 信息可以同时双向传送

4.2 WebsocketSocket区别

能够把WebSocket想象成HTTP应用层),HTTPSocket什么关系,WebSocketSocket就是什么关系。

1. WebSocketHTTP的关系

相同点

  1. 都是同样基于TCP的,都是可靠性传输协议。
  2. 都是应用层协议。

不一样点

  1. WebSocket是双向通讯协议,模拟Socket协议,能够双向发送或接受信息。HTTP是单向的。
  2. WebSocket是须要握手进行创建链接的。

2. Socket是什么?

Socket是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口。

在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来讲,一组简单的接口就是所有,让Socket去组织数据,以符合指定的协议。

4.1 扩展知识:Socket.IO的七层降级

GolangJava Spring等框架中,websocket都有一套实现API

Socket.IO 由两部分组成:

  1. 一个服务端用于集成 (或挂载) 到 Node.JS HTTP 服务器: socket.io
  2. 一个加载到浏览器中的客户端: socket.io-client

不少人觉得Socket.IO只是WebSocketXHR长轮询。

实际上,Socket.io有不少传输机制:

1. WebSockets 
2. FlashSocket 
3. XHR长轮询
4. XHR部分流:multipart/form-data
5. XHR轮询
6. JSONP轮询
7. iframe

得益于这么多种传输机制,Socket.io兼容性彻底不用担忧。

5. 扩展:HTTPSHTTP 核心区别

上面讲到 Socket是什么?,有一点我忘了讲:

HTTPSHTTP 核心区别在于两点:

  1. HTTP 下层的传输协议由 TCP/IP 换成了 SSL/TLS
  2. 收发报文再也不使用 Socket API,而是调用专门的安全接口。

具体区别:

  1. HTTPS协议须要到CA申请证书,通常免费证书不多,须要交费。
  2. HTTP是超文本传输协议,信息是明文传输,HTTPS 则是具备安全性的ssl加密传输协议。
  3. HTTPhttps使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443
  4. HTTP的链接很简单,是无状态的。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

后记及引用

本篇引用了大量资料和专栏:

1.《HTTPS篇之SSL握手过程详解》
<br/>
2.[《网络是怎样链接的》--户根勤]()
<br/>
3.[《图解HTTP》--上野宣 ]()
<br/>
4.[《透视HTTP协议》--罗剑峰]()
<br/>
5.《What Happens in a TLS Handshake?》
<br/>

  1. 《How to Use Websockets in Golang: Best Tools and Step-by-Step Guide》

在个人脑图中,总结归纳了8种HTTP核心问题。

做为一个转行的前端,理解这些HTTP的过程既痛苦又有趣。想要脑图的能够扫码加我,或公众号回复:HTTP

❤️ 看完三件事

若是你以为这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  2. 关注「前端劝退师」,不按期分享原创知识。
  3. 也看看其它文章

劝退师我的微信:huab119

也能够来个人GitHub博客里拿全部文章的源文件:

前端劝退指南https://github.com/roger-hiro...一块儿玩耍呀。~

相关文章
相关标签/搜索