前端需要关注的几种“握手”
前言
失业期间闲来无事,看了本《网络是怎样连接的》与两本HTTP
相关的专栏。
一方面补充专业知识,另一方面也是为了跳槽面试做准备。
避免看了即忘,就画了一张XMind
图:
值得深入的问题太多了,今儿就先来讲讲: Web
中的几种“握手”
1. 不止一种握手
在早期的网络传输中,也就存在TCP
协议需要“握手”的过程,但早期的协议有一个缺陷:通信只能由客户端发起,做不到服务器主动向客户端推送信息。
于是WebSocket
协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
而随着SSL/TLS
的完善,存在已久的安全版网络协议:HTTPS
也是迸发式发展。
最后前端领域的协议握手便成了三分天下:
TCP
三次握手,归HTTP
。TLS
握手,归HTTPS
WebSocket
握手,基于TCP
协议,都能用。
2. TCP
三次握手的终极意义
在我之前的文章:[《「真香警告」重学 TCP/IP 协议 与三次握手
》](https://juejin.im/post/5ca95e...
也详细的讲述过TCP
三次握手,但那时我未明确意识到其深刻含义。
就和大家一样,只在面试前会记得,过后即忘。
直到我看到《网络是怎样连接的》中的一段话:
你品,你细品。三次握手不就是相互试探暗号,来确定是不是对的人吗?
2.1 知识补充:一个网络包的最大长度
计算每个网络包能容纳的数据长度,协议栈会根据一个叫作 MTU
的参数来进行判断。
MTU
表示一个网络包的最大长度,在以太网中一般是1500
字节
MTU
是包含头部的总长度,因此需要从MTU
减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作MSS
。
由上两图可知,MSS
值是1460(1500-40)
字节,其中:
TCP
固定头部20
字节。IP
固定头部20
字节。TCP
头部最长可以达到60
字节。
3. TLS
握手:HTTPS
的核心
感兴趣的可以到这里看看:链接:https://tools.ietf.org/html/r...
3.1 TLS/SSL
究竟是啥?
很多人看到TLS/SSL
这对词就开始蒙圈了。实际上,这两个东西是一个玩意儿:
1999
年改名:SSL 3 === TLS 1.0
目前运用最广泛的是TLS 1.2
:
由于TLS/SSL
协议位于应用层和传输层 TCP 协议之间。TLS
粗略的划分又可以分为 2 层:
- 靠近应用层的握手协议
TLS Handshaking Protocols
- 靠近 TCP 的记录层协议
TLS Record Protocol
这个篇幅展开来写就太多了,我们先关心下TLS
握手吧。
3.2 TLS握手
详解
TLS握手何时发生?:
- 每当用户通过
HTTPS
导航到网站并且浏览器首先开始查询网站的原始服务器时,就会进行TLS
握手。 - 每当其他任何通信使用
HTTPS
(包括API
调用和HTTPS
查询上的DNS)时,也会发生TLS
握手。 - 通过TCP握手打开TCP连接后,会发生
TLS
握手。
TLS握手期间会发生什么?
在TLS
握手过程中,客户端和服务器将共同执行以下操作:
- 指定将使用的TLS版本(TLS 1.0、1.2、1.3等)
- 确定将使用哪些加密套件。
- 通过服务器的公钥和SSL证书颁发机构的数字签名来验证服务器的身份
- 握手完成后,生成会话密钥以使用对称加密
加密套件决定握手方式::
秘钥交换 | 身份验证 | |
---|---|---|
RSA握手 | RSA | RSA |
DH握手 | DH | RSA/DSA |
主流的握手类型,基本都是基于RSA
,所以以下讲解都基于 RSA
版握手。
整个流程如下图所示:
具体流程描述:
- 客户端
hello
:客户端通过向服务器发送“问候”消息来发起握手。该消息将包括客户端支持的TLS版本,支持的加密套件以及称为“客户端随机”的随机字节字符串。 - 服务器
hello
:为回复客户端hello
消息,服务器发送一条消息,其中包含服务器的SSL
证书,服务器选择的加密套件和“服务器随机数”,即服务器生成的另一个随机字节串。 - 客户端发送公钥加密的预主密钥。
服务器用自己的私钥解密加密的预主密钥。
- 客户端
finished
:客户端发送“完成”消息,该消息已用会话密钥加密。 - 服务器
finished
:服务器发送一条用会话密钥加密的“完成”消息。
- 客户端
- 握手完成,后续通过主密钥加解密。
只有加密套件,讲解的话需要有抓包基础。改天,改天我一定讲。。。
4. WebSocket
握手
WebSocket
协议实现起来相对简单。它使用HTTP
协议进行初始握手。成功握手之后,就建立了连接,WebSocket
基本上使用原始TCP读取/写入数据。
《图解HTTP
》一书中的图讲的比较清楚:
具体步骤表现是:
- 客户端请求:
GET /chat HTTP/1.1Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
- 服务端响应:
HTTP/1.1 101Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
4.1 Websocket
全双工通信
Websocket
协议解决了服务器与客户端全双工通信的问题。
那什么是单工、半双工、全双工通信?
类型 | 能力 |
---|---|
单工 | 信息单向传送 |
半双工 | 信息能双向传送,但不能同时双向传送 |
全双工 | 信息能够同时双向传送 |
4.2 Websocket
和Socket
区别
可以把WebSocket
想象成HTTP
应用层),HTTP
和Socket
什么关系,WebSocket
和Socket
就是什么关系。
1. WebSocket
与HTTP
的关系
相同点
- 都是一样基于
TCP
的,都是可靠性传输协议。 - 都是应用层协议。
不同点
WebSocket
是双向通信协议,模拟Socket
协议,可以双向发送或接受信息。HTTP
是单向的。WebSocket
是需要握手进行建立连接的。
2. Socket
是什么?
Socket
是应用层与TCP/IP
协议族通信的中间软件抽象层,它是一组接口。
在设计模式中,Socket
其实就是一个门面模式,它把复杂的TCP/IP
协议族隐藏在Socket
接口后面,对用户来说,一组简单的接口就是全部,让Socket
去组织数据,以符合指定的协议。
4.1 扩展知识:Socket.IO
的七层降级
在Golang
、Java Spring
等框架中,websocket
都有一套实现API
。
Socket.IO
由两部分组成:
- 一个服务端用于集成 (或挂载) 到
Node.JS HTTP
服务器:socket.io
- 一个加载到浏览器中的客户端:
socket.io-client
很多人以为Socket.IO
只是WebSocket
和XHR
长轮询。
实际上,Socket.io
有很多传输机制:
1. WebSockets2. FlashSocket
3. XHR长轮询
4. XHR部分流:multipart/form-data
5. XHR轮询
6. JSONP轮询
7. iframe
得益于这么多种传输机制,Socket.io
兼容性完全不用担心。
5. 扩展:HTTPS
与HTTP
核心区别
上面讲到 Socket
是什么?,有一点我忘了讲:
HTTPS
与HTTP
核心区别在于两点:
- 把
HTTP
下层的传输协议由TCP/IP
换成了SSL/TLS
- 收发报文不再使用
Socket API
,而是调用专门的安全接口。
具体区别:
HTTPS
协议需要到CA
申请证书,一般免费证书很少,需要交费。HTTP
是超文本传输协议,信息是明文传输,HTTPS
则是具有安全性的ssl加密传输协议。HTTP
和https
使用的是完全不同的连接方式,用的端口也不一样,前者是80
,后者是443
。HTTP
的连接很简单,是无状态的。HTTPS
协议是由SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,比HTTP
协议安全。
后记及引用
本篇引用了大量资料和专栏:
在我的脑图中,总结概括了8种HTTP
核心问题。
作为一个转行的前端,理解这些HTTP
的过程既痛苦又有趣。想要脑图的可以扫码加我,或公众号回复:HTTP
❤️ 看完三件事
如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:
- 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
- 关注「前端劝退师」,不定期分享原创知识。
- 也看看其它文章
劝退师个人微信:huab119
也可以来我的GitHub
博客里拿所有文章的源文件:
前端劝退指南:https://github.com/roger-hiro...
一起玩耍呀。~
以上是 前端需要关注的几种“握手” 的全部内容, 来源链接: utcz.com/a/42946.html