WebSocket协议深入理解

    xiaoxiao2023-11-21  4

    1.WebSocket和HTTP的关系

    WebSocket只有在建立握手连接的时候借用了HTTP协议的头,连接成功后的通信部分都是基于TCP的连接。总体来说,WebSocket协议是HTTP协议的升级版。

    2.研究WebSocket的思路

    服务器端自己实现WebSocket非常复杂。我们虽然不求能够完全自己实现,但是还是应该了解一下后端实现WebSocket的整体思路。

    WebSocket的实现主要分为两个部分:建立连接(握手)和数据传输。下面对这两个过程分别进行分析。

    3.建立连接

    (1)客户端发送请求

    WebSocket协议的实现首先需要客户端和服务器进行握手连接。首先客户端向服务器发送请求,请求报文中的重点内容如下:

    GET /chat HTTP/1.1

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

    从GET处可以看出,这是一个基于HTTP的请求。接下来的Upgrade字段和Connection字段完成了对HTTP协议的升级(HTTP Upgrade Request)。Upgrade字段通知服务器,现在要使用一个升级版协议——websocket。接下来是Sec-WebSocket-Key字段,这个字段是一串生成的BASE64加密的密钥,它被一同发送到服务器端。

    此外还有诸如Sec-WebSocket-Version、Sec-WebSocket-Protocol等字段,由于是可选字符,对WebSocket协议的实质影响不大,同时为了文章更简洁更容易理解,先不进行介绍。

    (2)服务器端进行处理

    服务器收到客户端请求后要进行响应。首先服务器需要处理客户端传递过来的Sec-WebSocket-Key。服务器端有一个全局唯一标识符GUID,这个是固定的。服务器端将客户端传来的字符串和服务器端的GUID拼接到一起后进行SHA1处理,再进行一次BASE64加密,准备将其返回客户端。

    (3)服务器端返回响应

    服务器端处理完成后,将给客户端返回响应报文,重要部分如下:

    HTTP/1.1 101 Switching Protocols

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

    第一行再次表明此次连接的建立是以HTTP协议为基础的。同时返回了101状态码。101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求。那么协议是什么时候升级到WebSocket的呢?当发送完这个响应最后的空行后,服务器就会切换到Upgrade消息头定义的WebSocket协议。至此完成了从HTTP协议升级的WebSocket协议的过程。同时需要注意,如果返回的状态码不是101,就表示握手升级的过程失败了。

    中间两行就不用说了,最后一行Sec-WebSocket-Accept返回的就是服务器端处理后的字符串。只有返回了这个字符串才表明握手成功了,返回其他的字符串都表示握手失败。

    4.数据传输

    WebSocket的数据帧格式如下:

    这里需要对数据帧进行一个解析,需要返回一个由键值对组成对象,这里先不对解析数据帧的方法进行解析。这个对象就是解析后的数据帧,里面有各个字段以及对应的值。对每个字段的含义如下:

    FIN      表示信息的最后一帧,flag,也就是标记符

    RSV 1-3  以后备用的,默认都为 0

    Opcode   帧类型

    Mask     掩码,表示是否加密数据,默认必须置为1 (这里很蛋疼)

    Payload  数据的长度

    Masking-key   掩码

    Payload data  数据

    Extension data   扩展数据

    Application data 程序数据

    将数据帧解析之后,生成的就是上面各个字段加其对应的值。这里面的重点部分是Opcode和Payload data字段。Opcode表示帧类型,每次用户代理接收到数据包时,都要先对Opcode进行判断。Opcode的状态值及其对应含义列表如下:

     0        Continuation Frame                

     1        Text Frame                        

     2        Binary Frame                      

     8        Connection Close Frame            

     9        Ping Frame                        

     10      Pong Frame                       

    判断了Opcode后,根据Opcode的具体状态,决定如何对PayLoad data的数据进行解析,从而进行数据传输。

    转载请注明原文地址: https://ju.6miu.com/read-1284169.html
    最新回复(0)