websocket 中的 Handshaking 是什么?
Handshaking 是 WebSocket 建立连接的第一步,它是一个类似于 HTTP 请求的过程,在客户端和服务器之间交换握手信息,以确定双方是否支持 WebSocket 协议,并建立起 WebSocket 连接。其主要步骤如下:
客户端向服务器发送升级协议请求:客户端通过普通的 HTTP GET 请求向服务器发送一个包含特殊头部字段 Upgrade
和 Connection
的HTTP 请求。
服务器相应升级协议请求:当服务器收到客户端的升级协议请求后,会对该请求进行处理,并返回一个特殊的响应头部字段 Upgrade
和 Connection
,并附上一个随机生成的字符串(Sec-WebSocket-Key)作为握手口令。
客户端发送握手确认请求:客户端接收到服务器的响应之后,会对该响应进行处理,并根据约定的算法将服务器返回的 Sec-WebSocket-Key 字符串与一个魔术字符串拼接起来,然后进行 SHA1 加密,并将结果转换成 Base64 编码格式,最后将加密后的结果作为 Sec-WebSocket-Accept
字段值附在新的请求头部中,再次发送给服务器。
服务器确认握手请求:当服务器收到客户端的握手确认请求后,会对请求头中的 Sec-WebSocket-Accept
字段进行验证,如果验证通过,则表示握手成功,并且服务器会返回一个状态码为 101 的 HTTP 响应,表示 WebSocket 连接已经建立。
WebSocket 连接建立:当客户端收到服务器的确认响应之后,WebSocket 连接就正式建立了,此时客户端和服务器都可以通过 WebSocket 协议进行双向通信。
在 Handshaking 过程中,需要交换的头部字段包括 Upgrade
、Connection
、Sec-WebSocket-Key
和 Sec-WebSocket-Accept
等,其中 Sec-WebSocket-Key
、Sec-WebSocket-Accept
是握手过程的关键参数,用于实现加密和验证。同时,在 Handshaking 过程中,需要保证请求和响应头部的正确性和完整性,以防止出现安全漏洞和错误数据。