WebSocket握手过程

前言

在现代Web应用中,实时通信和即时更新已成为日益重要的需求。而传统的HTTP协议在实现实时性和双向通信方面存在一定的限制。为了解决这个问题,WebSocket协议应运而生。

WebSocket是一种基于HTTP协议的扩展,它提供了一种持久的、双向的通信通道,使得服务器能够实时地向客户端推送数据。而要建立这样的通道,WebSocket需要经过一次特殊的握手过程

本文将深入探讨WebSocket的握手过程,从请求的发起到响应的确认,揭示WebSocket如何在Web应用中实现实时通信的奇妙之处。

WebSocket握手过程

wobsocket会经过下面几个步骤:

  1. 客户端发送WebSocket握手
  2. 服务器响应握手请求
  3. 客户端验证握手响应
  4. 认确握手成功并建立websocket连接

1.客户端发送WebSocket握手请求

当客户端想要建立WebSocket连接时,它会发送一个HTTP/1.1协议,GET请求到服务器。这个请求通常称为握手请求,其中包含一些特定的头信息(如下展示)来指示客户端希望升级到WebSocket协议。

Upgrade:websocket  // 指示客户端希望升级到WebSocket协议
Connection:Upgrade //指示客户端希望建立持久连接
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==  //生成一个随机的Base64编码密钥,用于安全验证。
Sec-WebSocket-Version:13 //指示客户端使用的WebSocket协议版本

image-20230915200251274

2. 服务器响应握手请求

服务器接收到客户端的握手请求后,会进行一些验证和处理。如果服务器支持WebSocket协议,并且验证通过,它将返回一个HTTP响应,称为握手响应。

  • 验证协议和请求方法

WebSocket协议是基于HTTP/1.1协议的,并且WebSocket协议规定了在初始握手阶段,客户端向服务器发送的请求方法必须是"GET"

所以,服务器首先会验证该请求是否符合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进行计算后返回的验证值

image-20230915200920156

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进行实时双向通信,发送和接收数据帧。

image-20230915201031976

下面总一下websocket握手的整个流程:

  1. 客户端发送WebSocket握手请求:当客户端想要建立WebSocket连接时,它会发送一个HTTP请求到服务器。这个请求通常称为握手请求,其中包含一些特定的头信息(Upgrade,Connection,Sec-WebSocket-Key,Sec-WebSocket-Version)来指示客户端希望升级到WebSocket协议。
  2. 服务器响应握手请求:服务器接收到客户端的握手请求后,会进行一些验证协议、请求方法和Upgrade,Connection等信息头,并且生成Sec-WebSocket-Accept。如果服务器支持WebSocket协议,并且验证通过,它将返回一个带有101状态码的http响应,称为握手响应。
  3. 握手响应确认:客户端收到服务器的握手响应后,会验证响应中的一些头信息(例如Sec-WebSocket-Accept等),以确保握手成功。如果验证通过,客户端将确认握手成功。
  4. 建立WebSocket连接:一旦握手成功确认,WebSocket连接就被建立。此时,客户端和服务器之间的连接将从HTTP协议升级为WebSocket协议。
  5. 双向数据传输:通过建立的WebSocket连接,客户端和服务器可以进行双向数据传输。它们可以使用WebSocket API发送和接收消息,实现实时的双向通信。

作者:十八画生ovo
链接:https://juejin.cn/post/7251974224922804261

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值