简述WebSocket握手过程:实现实时通信的关键步骤
引言
在现代Web应用中,实时通信和即时更新已成为日益重要的需求。而传统的HTTP协议在实现实时性和双向通信方面存在一定的限制。为了解决这个问题,WebSocket协议应运而生。
WebSocket是一种基于HTTP协议的扩展,它提供了一种持久的、双向的通信通道,使得服务器能够实时地向客户端推送数据。而要建立这样的通道,WebSocket需要经过一次特殊的握手过程。
本文将深入探讨WebSocket的握手过程,从请求的发起到响应的确认,揭示WebSocket如何在Web应用中实现实时通信的奇妙之处。
ps:如果还不清楚websocket该怎么使用的可以先看超简单!WebSocket的使用指南,有一定基础后再看本文。(学神请无视该条)
WebSocket握手过程
wobsocket会经过下面几个步骤:
- 客户端发送WebSocket握手
- 服务器响应握手请求
- 客户端验证握手响应
- 认确握手成功并建立websocket连接
1.客户端发送WebSocket握手请求
当客户端想要建立WebSocket连接时,它会发送一个HTTP/1.1协议,GET请求到服务器。这个请求通常称为握手请求,其中包含一些特定的头信息(如下展示)来指示客户端希望升级到WebSocket协议。
Upgrade:websocket // 指示客户端希望升级到WebSocket协议
Connection:Upgrade //指示客户端希望建立持久连接
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ== //生成一个随机的Base64编码密钥,用于安全验证。
Sec-WebSocket-Version:13 //指示客户端使用的WebSocket协议版本
2. 服务器响应握手请求
服务器接收到客户端的握手请求后,会进行一些验证和处理。如果服务器支持WebSocket协议,并且验证通过,它将返回一个HTTP响应,称为握手响应。
验证协议和请求方法
WebSocket协议是基于HTTP/1.1协议的,并且WebSocket协议规定了在初始握手阶段,客户端向服务器发送的请求方法必须是"GET"。
ps: 虽然WebSocket握手请求使用"GET"方法,但WebSocket连接之后的消息传递不受HTTP方法的限制,可以在连接建立后自由地发送和接收数据。
所以,服务器首先会验证该请求是否符合WebSocket协议的规范,包括确认请求方法为GET、HTTP版本为1.1
检查头信息
服务器会检查请求中的Upgrade和Connection头信息,确保它指示要升级到WebSocket协议。
生成Sec-WebSocket-Key
服务端接收到客户端传过来的Sec-WebSocket-Key之后,将其与固定的GUID进行拼接,经过SHA-1哈希和Base64编码处理,将生成的Base64编码值作为Sec-WebSocket-Accept的值
返回握手响应
如果服务器确认请求符合WebSocket协议的规范,它将返回一个HTTP响应,状态码为101,表示服务器已理解客户端请求,通知客户端采用不同的协议来完成这个请求。
并且返回以下头信息
Upgrade:websocket //指示服务器已升级到WebSocket协议
Connection:Upgrade //指示服务器已建立持久连接
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo= //服务器对Sec-WebSocket-Key进行计算后返回的验证值
3.客户端验证握手响应
检查响应状态码
客户端接收到服务器的握手响应后,首先检查响应状态码是否为101
检查响应头信息
如Upgrade和Connection,以确保服务器确认升级到WebSocket协议并建立持久连接。
验证Sec-WebSocket-Accept头信息
客户端接收到服务端的握手响应后,将获取到的Sec-WebSocket-Accept与自己生成的Sec-WebSocket-Key进行验证。
客户端将接收到的Sec-WebSocket-Key与固定的GUID进行拼接,并进行与服务端相同的SHA-1哈希和Base64编码处理。
最后,客户端将生成的Base64编码值与服务端返回的Sec-WebSocket-Accept进行比较。如果两者相等,则验证通过,握手成功;否则,验证失败,握手失败。
4.认确握手成功并建立websocket连接
确认握手成功,客户端将连接从HTTP协议升级为WebSocket协议。客户端和服务器之间的通信将使用WebSocket协议进行双向实时数据传输。
需要注意的是,WebSocket握手成功并升级协议后,后续的数据传输将不再遵循HTTP的请求-响应模型,而是使用WebSocket协议的帧结构进行数据交换。客户端和服务器可以通过WebSocket API进行实时双向通信,发送和接收数据帧。
总结
下面总一下websocket握手的整个流程:
-
客户端发送WebSocket握手请求:当客户端想要建立WebSocket连接时,它会发送一个HTTP请求到服务器。这个请求通常称为握手请求,其中包含一些特定的头信息(Upgrade,Connection,Sec-WebSocket-Key,Sec-WebSocket-Version)来指示客户端希望升级到WebSocket协议。
-
服务器响应握手请求:服务器接收到客户端的握手请求后,会进行一些验证协议、请求方法和Upgrade,Connection等信息头,并且生成Sec-WebSocket-Accept。如果服务器支持WebSocket协议,并且验证通过,它将返回一个带有101状态码的http响应,称为握手响应。
-
握手响应确认:客户端收到服务器的握手响应后,会验证响应中的一些头信息(例如Sec-WebSocket-Accept等),以确保握手成功。如果验证通过,客户端将确认握手成功。
-
建立WebSocket连接:一旦握手成功确认,WebSocket连接就被建立。此时,客户端和服务器之间的连接将从HTTP协议升级为WebSocket协议。
-
双向数据传输:通过建立的WebSocket连接,客户端和服务器可以进行双向数据传输。它们可以使用WebSocket API发送和接收消息,实现实时的双向通信。
转载自:https://juejin.cn/post/7251974224922804261