• 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
  • 相关阅读:
    新学期——扬帆起航
    我与虚拟机的爱恨情仇
    20155329胡佩伦的第二次预备作业——再思考
    课前的第一次与老师交流
    # 20155327 2016-20017-3 《Java程序设计》第3周学习总结
    20155327《Java程序设计》第二周学习总结
    20155327 2016-2017-2 《Java程序设计》第一周学习总结
    20155327第三次作业
    20155327 学习基础和C语言基础调查
    记自己的第一篇博客
  • 原文地址:https://www.cnblogs.com/attila/p/10713955.html
Copyright © 2020-2023  润新知