websockets的原理

2023-02-12

一、应用场景

  http 协议 客户端发起请求的时候才会返回内容,如果要处理类似于聊天室的应用,需要客户端不间断的发起请求(轮询),非常占用服务器的性能。所以websocket出现了。

二、ws(wss)协议原理

    1、特点

    服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息
   (1)建立在 TCP 协议之上,服务器端的实现比较容易。
   (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
   (3)数据格式比较轻量,性能开销小,通信高效。
   (4)可以发送文本,也可以发送二进制数据。
   (5)没有同源限制,客户端可以与任意服务器通信。
   (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

    2、使用:

    1、浏览器(BOM)实现的不是v8引擎实现的,每次使用都需要自定义
      

    var ws = new WebSocket(url,[protocol]);

    2、webSocket.readyState属性返回实例对象的当前状态,共有四种

    四种状态:
          CONNECTING:值为0,表示正在连接。
          OPEN:值为1,表示连接成功,可以通信了。
          CLOSING:值为2,表示连接正在关闭。
          CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

    js示例

switch (ws.readyState) {
case WebSocket.CONNECTING:
// do something
break;
case WebSocket.OPEN:
// do something
break;
case WebSocket.CLOSING:
// do something
break;
case WebSocket.CLOSED:
// do something
break;
default:
// this never happens
break;
}

  3、http 和ws的关系:

     就是在headers上添加了几个升级的协议包,做了一次协议升级,http常用ajax发包,但是ws不是,它是一个长链接协议,会等待服务器发包。http发的包经常是文本性信息(json/xml/纯文本/自定义/字节码)。但是ws发回来的是字节码(谷歌协议(protobuf(体积比较小常用于游戏协议))QQ的TLV 协议(通用,可以很好处理粘包)  自定义的格式)

    套接字 tcp/udp(会有粘包的问题)

三、websocket的关键词

    1、websocket本身就是一个关键词,因为每次使用都需要自定义

    2、webSocket.readyState 返回实例对象的当前状态
    3、webSocket.onopen 用于指定连接成功后的回调函数 (因为解密我们关心cookie/tooken等)
    4、webSocket.onclose 用于指定连接关闭后的回调函数
    5、webSocket.onmessage 指定收到服务器数据后的回调函数 (因为解密我们关心)
    6、webSocket.send() 用于向服务器发送数据 (因为解密我们关心加密的内容和算法)
    7、webSocket.bufferedAmount 判断发送是否结束
    8、webSocket.onerror 用于指定报错时的回调函数

四、连接包和心跳包

    连接包:webSocket.onopen
      心跳包:如果出现断电等情况,需要让服务器知道我下线,不再等我,客户端每隔一段时间(等30s)发一个没有信息,用于告诉服务器我还在线。否则会被踢出。那么我们爬取的的时候还要注意心跳包的存在。

五、练习:网站(蝌蚪聊天室 http://www.wodexiaoshijie.com/kedou/)

  1、步骤

      抓包
      分析包的信息
      调试
      本地运行

  2、案例(虎牙)
    抓包
      1、搜索下断,搜到很多
      2、搜索socket对象 hook send方法 直接快速
        假设 p 是socket对象
        // TODO hook
        #p.send是被调用的函数名,而p.send_是被调用的功能
        #hook就是在被调用的函数名和被调用的功能之间下一个断点
        #从而实现一旦这个函数被调用,就会被下一个断点
      3、hook

//控制台输入,用于hook
p.send_ = p.send;
//控制台输入,用于hook
p.send = function(x){
debugger;
return p.send_(x);
}

websockets的原理的相关教程结束。

《websockets的原理.doc》

下载本文的Word格式文档,以方便收藏与打印。