美文网首页
websocket连接【新】

websocket连接【新】

作者: 糖糖不加糖_ | 来源:发表于2023-02-15 12:58 被阅读0次

    https://www.cnblogs.com/chyingp/p/websocket-deep-in.html
    https://cloud.tencent.com/developer/article/1887095
    https://www.ruanyifeng.com/blog/2017/05/websocket.html

    websocket是一种网络传输协议,可以在单个tcp连接上进行全双工通讯,位于osi模型的应用层(http也位于应用层)

    websocket与http关系

    websocket复用了http的握手通道,在http连接的基础上,客户端发起协议升级,采用的是标准的http报文格式,且只支持get方法

    客户端
    GET / HTTP/1.1
    Host: localhost:8080
    Origin: http://127.0.0.1:3000
    Connection: Upgrade  // 表示协议升级
    Upgrade: websocket  // 表示升级到websocket协议
    // websocket版本,如果服务器不支持此版本,则会返回Sec-WebSocket-Version 的header,里面有所有他支持的版本
    Sec-WebSocket-Version: 13  
    // 与服务器的Sec-WebSocket-Accept配套使用,提供基本的防护,比如无意链接、恶意连接
    Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==  
    
    服务器端
    HTTP/1.1 101 Switching Protocols  // 协议切换,完成协议升级
    Connection:Upgrade
    Upgrade: websocket
    // 这个值与客户端Sec-WebSocket-Key有关,通过SHA1散列算法获取摘要信息值,并转成base64字符串
    Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=·
    

    websocket的api

    var ws = new WebSocket('ws://localhost:8080');
    

    执行了上面的语句,websocket就会进行连接

    websocket.readyState

    返回实例对象的当前状态

    • 0(connecting):正在连接
    • 1(open):连接成功可以通信
    • 2(closing):正在关闭
    • 3(closed):连接已关闭,或打开链接失败
    websocket.onOpen()

    用于连接成功后的回调函数

    websocket.onClose()

    用于连接管壁厚的回调属性

    websocket.onMessage()

    收到服务器数据后的回调函数

    websocket.send()

    向服务器发送数据的函数

    websocket.error()

    用于报错时的回调函数

    websocket.bufferedAmount

    判断发送是否结束(表示还有多少二进制字节的数据没有发送出去)

    var data = new ArrayBuffer(10000000);
    socket.send(data);
    
    if (socket.bufferedAmount === 0) {
      // 发送完毕
    } else {
      // 发送还没结束
    }
    

    websocket优点

    • 基于tcp协议基础上的,服务器端实现起来比较容易
    • 与http有良好的兼容性,能够通过http代理(握手阶段采用http协议,不容易被屏蔽)
    • 数据格式比较轻量,开销小
    • 没有同源限制,客户端可以与任意服务器通信

    轮询(短轮询)、长轮询和websocket区别

    image.png image.png

    轮询(短轮询):浏览器每隔一段时间向服务器发送一次请求,服务器返回最新的数据给浏览器
    长轮询:客户端发器请求,服务器端在收到后,会不直接进行响应,将请求挂起,然后判断请求的数据是否有更新,或者超时才会返回给客户端。 eg:comet的实现方式之一,另一种(http://www.52im.net/thread-336-1-1.html%235
    websocket:全双工协议,服务器端游数据更新后可以直接发消息给客户端

    代理缓存污染攻击(ws引入掩码计算为了防止此攻击)

    • 攻击者发送ws协议升级到攻击者服务器
    • 升级请求发送到了代理服务器,经攻击者服务器响应后,代理服务器将响应回复给攻击者,连接通道打通
    • 攻击者通过WebSocket向攻击者服务器发送数据,其中包含被攻击资源的地址,以及一个伪造的host(指向被攻击资源的服务器)
    • 代理服务器会缓存数据,当下一次被攻击者发送请求时,会直接将缓存数据发给被攻击者

    只能说不能完全防范,但是加大了难度

    相关文章

      网友评论

          本文标题:websocket连接【新】

          本文链接:https://www.haomeiwen.com/subject/qmtuiltx.html