面试官问到三次握手,我甩出这张脑图,他服了!
前语
赋闲期间闲来无事,看了本《网络是怎样衔接的》与两本HTTP
相关的专栏。
一方面补充专业常识,另一方面也是为了换岗面试做准备。
防止看了即忘,就画了一张XMind
图:

值得深入的问u G / v k [题太多了,今儿就先来讲讲: Web
中^ Z _ C R 9的几种“握手”

1. 不止一种握手
在早期的网络传输中,也就存在TCP
协议需求“握手”的进程,但早期的协议有一个缺陷:通讯只能由客户端建议,做不到服务器主动向客户端推送信( j s # ? v息。

所以WebSocket
协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支撑了。
而随着SSL/TLS
的完善,存在已久. 0 K – {的安全版网络协议:HTTPS
也是迸发式发展。
最终前端范畴w c o ) c y & a的协议握手便成了三分全国:
-
TCP
三次握手,A I p – e 5 g ;归HTTP
。 -
TLS
握手,归HTTPS
-
WebSocket
握手,根据TCP
协议,都能用。
2. TCP
三次握手的终极含义
在我之前的文章:《「真香正告」重学 TCP/IP 协议 与三次握手
》
也详细的讲述过TCP
三次握手,但那时我未清晰意识到其深刻含义。
就和大家一样,只在面试B M 1前会记住,过后即忘。
直到我看到《网6 D ^ A I E络是怎样衔接的d q ` –》中的一段话:
在实践的通讯中,序号并不是从 1 开端的,而是需求用随机数核算出一个初始值,这是因为
假如序号c T 8都从 1@ a w Z $ U 开端,通讯进程就会十分简略猜测,有人会运用这一点来建议攻击。可是假如初始值是随机的,那么对方就搞不清楚序号到底是从
多少开端核算的,因而需求在开端收发数据之u K d 5 Y .前将初始值告知通讯对象。

你品,你细品。三次握手不便是彼此试探暗号,来确认是不是对的人吗?
2.1 常识补充:一个网络包的最大长度
核算每个网络包能容纳的数据长度,协议D S P *栈会依据一个叫作 MTU
的参数来进行判别。
MTU
表明一个网络包的最大长度,在以太网中一般是15A 8 a00
字节
MTU
是包括头部的总长度,因而需求从MT+ j KU
减去头部的长度,然后得到的长度便是一个网络包中所能容纳的最大数据长度,这一长度叫作MSS
。


由上两图可知,MSS
值是1460(1500-40)
字节,其间:
-
TCP
固定头部20
字节。 -
IP
固定头部20
字节。 -
TCP
头部最长能够达到60
字节。
3. TLS
握手:HTTPS
的中心

HTTPS
其实是一个“十分简略”的协议,RFC
文档很小,只要短短的 7 页,里面规定了新的协议名“https
”,默许端口号 447 f S3,至于其他的什么恳求 – 应对形式、报文结构、恳求方法、URI
、头字段、衔接办理等等都彻底沿袭HTTP
,没有任何新的东西。—3 s . q k K W ]– 《透视HTT0 q P 2 / - 7 tP
协议》
感兴趣的能够到这里看看:链接:tools.ietf.org/html/rfc281…
3.1 TLS/SSL
究竟是w 7 E H啥?

很多人看到TLS/SSL
这对词就开端蒙圈了。实践上,这两个东西是一个玩意儿:

1999
年改名:SSL 3 === TLS 1.0
现在运用最广泛的是TLS 1.2
:
TLS
由记载协议、c X R f E – Z x |握手协议、正告协e 8 A – { B 3 k议、改变密码规范协议、扩展协议等几个子协议组成,归纳运用了对称加密、[ n v y :非对称加密、身份认证等许多密码学前沿技术。
因为TLS/SSL
协议坐落_ & @ T Y应用层和传输层 T) S + ? – SCP 协议之间。TLS
粗略的划分又能够分为 2 层v j J { 3 :
-
接近应用层的握手协议
TLS Handshaking Protocols
-
接近 TCP 的记W $ X ) S 8 K |载层协议
TLS Record Protocol
这个篇0 5 G幅展开来写就太多了,咱们先关心下TLS
握手吧。
3.2 TLS
握手详解
TLS握手何时发作?:
- 每逢用户经过
HTTPS
导航到网站而且浏览器首先开端查询网站的原始服务器时,就会进行TLS
握手。 - 每逢其他任R % c 0 z ~ 6何通讯运k & 2 @ d H W #用
HTTt s L *PS
(包括API
调5 A $ v 8 v H 2 –用和H{ 2 WTTPS
查询上的DNS)时,也会发作TLS
握手。 - 经过TCP握手打开TCP衔接后,会发作
TLS
握手。

TLS握手期间会发作什么?
在TLS
握手进程中,客户端和服务器将共同履行以下操作:
- 指定将运用的TLS版别(TLS 1.0、1.2、1. Y ^ x # * `3等)
- 确认将运用哪些加密套件。
- 经过服务器的公钥和SSL证书颁发机构K h X 0 @ / : %的} Q ) b @ d / b Y数字签名来验证服X ! t务器的身份
- 握手完结后,生成会话密钥以运用对称加密
加密套件决定握@ c r W [ w O p Z手方式::
摘x u j [ n自:《HTTPS篇之SSL握手进程详解H _ 3 r》
在TLS
中有两种首要的握手类型:一种$ ! ! / u Q根据RSA
,一种根据Diffie-Hellman
。 这两种握手类型的首要差异在于主秘钥交流和认证上。
秘钥交流 | 身份` X ? O @ o U %验证 | |
---|---|---|
RSA握手 | RSA | RSA |
DH握手 | DH | RSA/DSA |
主流的握手类型,基本都是根据RSA
,所以以下解说都根据RSA
版握手。
整个流程如下图所示:

具体流程描述:
- 客户端
hello
:客户端经过向服务器发送“问候”音讯来, / k % B建议握手。该音讯将包括客户端支撑的TLS版别,支撑的加密套件以及称为“客户端随机”的随机字节字符串。 - 服务器
hello
:为回复客户端hello
音讯,服务器发送一条音讯,其间包括服务器的SSL
证书,服务器挑选的加密套件和U * [ w 1“服务器随机数”,即服务器生成的另一个随机字节串。 - 客户端发送公钥加密y p X Q i A ( S ~的预主密钥。
- 服务器用自己的私钥解密加密的预主密_ j ~钥。
- 客户端
finished
:客户端发送“完结”音讯,该音讯已用会话密钥加密。 - 服务器
finished
:服务器发送一条用会话密钥加密的“完结”音讯。
- 客户端
- 握手完结,后续经过主密钥加解{ ; {密。
只要J 9 ] P S加密套0 G q件,解说的话需求有抓包根底。改天,改天我一定讲。。。

4. WebSocket
握手

WebSocket
协议完成[ 4 $ = S起来相对简略。它运用HTTP
协议进行初始握手。成功握手之后,就树立了衔接,WebSocket
基本上运用原始TCP读取/写入数据。
《图解HTTP
》一书中的图讲的比较清楚:

具体步骤表现是:
- 客户端恳求:
GET /chat HTTP/1.1
Host: server` 2 . 6 m . 2.example.com
Upgrade: websocket
Connection: Upgrade
Se= 6 ^ ~ # | hc-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket/ V 9 V p L-Protoc` t dol: chat, superchat
Sec-WebSocket-Vr B z 6 ` v z Lersion: 13
Ori+ ^ 6 t u ; c P 2gin: http://example.c: Y a l Eom
- 服务端响应:
HTTP/1.1 101
Switching Protoc] I /ols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:{ i ; m 4 . W * HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
4.1 Webk J N N ` F % esocketP e o
全H K ~ $双工T m 4 * ; U I 3通讯
Websocket
协议解决了服务器与客户端全双工[ h + i I通讯的问题。
那什么是单工、半双工、全双工通讯?
类+ E H F n e型 | 能力 |
---|---|
单工 | 信息单向W w H N e 8 Y b传送 |
半双工 | 信息能双向传送,但不能一起双向传送 |
全双工 | 信息能够一起双向传W 4 k ~ ! Q送 |
4.2 Websocket
和Socket7 $ Q
差异
能够把Web( ] 5 n ~ Socket
幻想成HTTP
应用层),HTTP
和Sockeh ( } 7 _t
什么关系,WebSocket
和c 6 MSocket
便是什么关系。
1. WebSocket
与HTTP
的关系
相同点{ | * w [
- 都是8 u w | v t x一样根据
TCP
的,都是可靠性传输协议。 - 都是应用层协议。( – f Y W 5
不同点
-
WebSocket
是双向通讯协议,模仿Socket
协议,能够双向发送或接受信O – G ) f息。HTTP
是单向的。 -
WebSz L M u T B ~ocket
是需求握a S + K手进行树立衔接的。
2. SM _ 8ocket
是什么?
SocW X H B S 7 e Xket 8 3
是应用层与TCP/IP
协议族通讯的中间软件抽象层,它是一组接口。
在设计形式中Q 8 m G ),Socket
其实便是一个门面形式N A c S [ q y –,它把复杂的TCP/IP
协议族隐藏在Socket
接口后面,对用户来说,一组简略的接口便是悉数,让Socket
去组织数据,以契合指定的协议。

4.1 扩展常识:Socket.IO
的七层降级
在Golang
、Java Spring
等框架中,websocket
都有一套完成AP} X P ! s ~ hI
。

Socket.IO
由两部分组成:
- 一个服务端用于集成 (或挂载) 到
Node.JS HTTP
服务器:socket.io
- 一个加载( x q {到浏览器中的客户端:
socket.io-client
很多人以为Socket.IO
只是WebSocket
和XHR
长轮询。
实践上,Socket.io
有很多传输机制:
1. WebSockets
2. FlY 7 g iashSocket
3. XHR长轮询
4. XHR部分流:multipart/form-data
5. XHR轮询
6. JSONP轮询
7. iframe
得益于这么多种传输机制,Socket.io
兼容性彻底不必担心。
5. 扩展:HTTPS
与HTTP
中心差异
上面讲到 Socket
是什么?,有一点我忘了讲:
HTTPS
与HTTP
中心差异在于两点:
- 把
HTTP
下层的传输协议由TCP/IP
换成f 8 ^ M L了SSL/TLS
- 收发报文不再运用
Socket API
,而是调用专门的安全接口。
具体差异:
-
HTTPS
协议需求到CA
申请证书,一般免费证书很少,需求交费。 -
HTTP
是超文本传输协议,信息是明文传输,HTTPS
则是具有安全性的ssl加密传输协议。 -
HTTP
和https
运用的是彻底不同的衔接方式,用的端口也不一样,前h e U J i 2 M _ J者是80
,后者是443
。 -
HTTP
的衔接很简略,是无状况的。HTTPS
协议是由SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,比HTTP
协议安全。
跋文及引用
本篇引用了很多资料和专栏:
1.《HTTPS篇之SSL握手进程详解》
2.《网络是怎样衔接的》–户根勤0 / k 9 i ( : Q V
3.《图解HTTP》–上野宣
4.《透视HTTP协议》–罗剑峰
5.《What Happs d 1 ` H 9 uensO : i } in a TLS Handshake?》
6. 《How to U~ v U 5 C Yse Webs1 C M hockets in GolangI r d N x: Best Tools and Step-by-Step Guide》
在我的脑图中,总结归纳了8种HTTP
中心问题。

作为一个转行的前端,理解这些HTe # $ eTP
的进程既痛苦又有趣。想要脑图的能% 5 R ;够扫码加我,或公众号回复:HTTP
❤️ 看完三件事
假如你觉得这篇内容对你挺有启发,我[ L u l M K想约请你帮我三个小忙:
- 点赞,让更多的人也能看到这篇内容(收藏o m O l Y不点赞,都是耍流氓 -_-)
- 关注公众号「前端劝退师」,不定期共享原创常识。
- 也看看其它文章

劝退师个人微信:huabk 8 r N P S ^ v &119
也能够来我的GitHub
博客里拿所有文章的源文件:
前端劝退攻略:github.com/r4 l ^ ~oger-hiro/…
一起玩耍呀。~