WebSocket原理

一 . WebSocket原理

  1.1.背景

WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动请求。

  1.2.相同点

1.都是基于TCP的应用层协议。
2.都使用Request/Response模型进行连接的建立。
3.在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。
4.都可以在网络中传输数据。

  1.3.不同点

1.WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用。
2.WS的连接不能通过中间人来转发,它必须是一个直接连接。
3.WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据。
4.WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息。
5.WS的数据帧有序。
6.WebSocket 分为握手和数据传输

  1.4.WebSocket的握手

客户端的握手如下:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

服务端的握手如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

客户端和服务端都发送了握手,并且成功,数据传输即可开始。

  1.5.建立握手的时候需要遵守的规则

1.请求【握手】信息中提取 Sec-WebSocket-Key
2.利用magic_string 和 Sec-WebSocket-Key 进行sha1加密,再进行base64加密
3.将加密结果响应给客户端
# 注:magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11

  1.6.数据传输

通过Http握手之后,如果是http 协议的话,tcp 连接会断开,这里在http 头部指明了升级为 websocket, 所以tcp 连接不断开。 
  WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范。 WebSocket 数据传输以数据帧的形式传输。

  1.7.payload length:传输数据长度

# hashstr = b'x81x83xceHxb6x85xffzx85'
# b'x81    x83    xceHxb6x85xffzx85'   
# print(hashstr[1]) #也就是打印x83得到一个数字,这个数字与127做位运算,得到一个值:
如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;
如果这个值是126,则随后的两个字节表示的是一个16进制无符号数,用来表示传输数据的长度;
如果这个值是127,则随后的是8个字节表示的一个64位无符合数,这个数用来表示传输数据的长度。

二 . 轮询

# 轮询
    客户端向服务器不断发起类似Http请求
    服务器不断的响应客户端

    带上你的身份牌 - 服务器校验身份
    大爷去找你的消息 - 服务器获取你应该拿到数据
    if:拿到数据
    else:拿不到数据 - 再次发起请求询问服务器消息
    
    劣势:
        1.双端资源浪费
    2.带宽资源占用
    3.不能保证数据实时性
    
上个世纪90年代 - 本世纪初:
    24bps == 4-6KB
    CPU == 800MHZ
    内存 == 256MB
    QQ -- ICQ 

三 . 长轮询

# 长轮询
    1.客户端向服务器发起一个请求 
    2.服务器保持这个请求 不返回不响应
    3.一定时间之后,服务器抛弃 or 返回
    4.客户端收到请求 立即再次发起保持
    
    你去传达室,大爷款待你喝茶,
    喝茶等消息(保持)
    上厕所或者大爷撵你走(断开)
    再次回去喝茶等消息(保持)
    
    劣势:
    1.服务器资源浪费
    2.不能保证数据实时性(可能在上厕所的时候来消息)
    优势:
    1.节省客户端资源(不用总去)
    2.保证数据有效
        
当时的环境:本世纪初 - 目前
    128bps == 20-30KB
    Cpu == 1.4GHZ 奔腾4
    内存 == 512MB

四 . 长连接

# 长连接    
    永久保持连接
    
    1.你和大爷之间装了一台电话分机
    2.你派人告诉大爷你的分机号码
    3.大爷拨通分机
    4.你告诉大爷,有消息说句话,我派人去拿
    5.你和大爷同时开启了闭音(我平常说话你听不见)
    
    劣势:
        1.服务器CPU要求较高
        
    优势:
        1.节省大量资源
        2.数据实时有效性
        3.带宽几乎不占用
    
现在的环境:
    100mps == 百兆光纤 == 5MB/s || 2KB
    CPU == 16核32线程 i9 3.2GHZ
    内存 == 16GB
原文地址:https://www.cnblogs.com/attila/p/10713955.html