一、应用场景

  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的原理的更多相关文章

  1. .NET WebSockets 核心原理初体验

    上个月我写了<.NET gRPC核心功能初体验>, 里面使用gRPC双向流做了一个打乒乓球的Demo, 实时双向这两个标签是不是很熟悉,对, WebSockets也可以做实时双向通信. 本 ...

  2. 如何仿造websocket请求?

    之前两次singnalr. websocket实时推送相关: .NET WebSockets 核心原理初体验 SignalR 从开发到生产部署避坑指南 tag: 浏览器--->nginx--&g ...

  3. How Javascript works (Javascript工作原理) (五) 深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势

    个人总结: 1.长连接机制——分清Websocket,http2,SSE: 1)HTTP/2 引进了 Server Push 技术用来让服务器主动向客户端缓存发送数据.然而,它并不允许直接向客户端程序 ...

  4. .NET应用程序调试—原理、工具、方法

    阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...

  5. 对.Net WebSocket 和Socket的原理的思考

    今早上班路上接到了一个朋友的微信信息,问我对WebSocket 是否熟悉,一楞,印象之中没有用过这个类....来到公司后,得空问了一下度娘,原来这是一个随着HTML5推出的一种新协议,意义在于能实现浏 ...

  6. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...

  7. MQTT, XMPP, WebSockets还是AMQP?泛谈实时通信协议选型 good

    Wolfram Hempel 是 deepstreamIO 的联合创始人.deepstreamIO 是一家位于德国的技术创业公司,为移动客户端.及物联网设备提供高性能.安全和可扩展的实时通信服务.文本 ...

  8. http-proxy-middleware使用方法和实现原理(源码解读)

    本文主要讲http-proxy-middleware用法和实现原理. 一 简介 http-proxy-middleware用于后台将请求转发给其它服务器. 例如:我们当前主机A为http://loca ...

  9. web安全之XSS攻击原理及防范

    阅读目录 一:什么是XSS攻击? 二:反射型XSS 三:存储型XSS 四:DOM-based型XSS 五:SQL注入 六:XSS如何防范? 1. cookie安全策略 2. X-XSS-Protect ...

  10. How Javascript works (Javascript工作原理) (七) WebAssembly 对比 JavaScript 及其使用场景

    个人总结: 1.webworkers实现了用多线程浏览器来进行多线程操作js的能力. 2.web workers不能操作dom,window,document等对象,一般用于cpu计算型的任务.   ...

随机推荐

  1. k8s ingress-nginx 使用 snippet 添加自定义配置 (比如:新增请求头)

    比如在有些时候我们需要在 server 里或者 location 里添加一些参数,例如添加包体大小限制.添加跨域配置.添加自定义header.处理响应header等等.遇到这些需求的时候,我们开始怀念 ...

  2. Beats:如何安装Packetbeat

  3. 第1篇----Istio原理篇

    Istio是什么 ◎ Istio是一个用于服务治理的开放平台. ◎ Istio是一个Service Mesh形态的用于服务治理的开放平台. ◎ Istio是一个与Kubernetes紧密结合的适用于云 ...

  4. host主机监控规则

    1.先在 Prometheus 主程序目录下创建rules目录,然后在该目录下创建 host.yml文件,内容如下: 内容很多,可以根据实际情况进行调整. 规则参考网址:https://awesome ...

  5. 4.Gitlab CI 与 Kubernetes 的结合

    参考网址:https://www.qikqiak.com/post/gitlab-ci-k8s-cluster-feature/

  6. Python中dataclass库

    目录 dataclass语法 一. 简介 二. 装饰器参数 三. 数据属性 1. 参数 2. 使用示例 3. 注意事项 四. 其他 1. 常用函数 2. 继承 3. 总结 dataclass语法 一. ...

  7. PAT甲级英语单词整理

    proper 正确 合适 vertex(vertices)顶点 respectively 个别 分别 indices 指标 索引 shipping 运输 incompatible 不相容 oxidiz ...

  8. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)

    对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...

  9. AVX图像算法优化系列一: 初步接触AVX。

    弄了SSE指令集,必然会在不同的场合不同的人群中了解到还有更为高级的AVX指令集的存在,早些年也确实有偶尔写点AVX的函数,但是一直没有深入的去了解,今年十一期间也没到那里去玩,一个人在家里抽空就折腾 ...

  10. JVM中的堆

    堆 内存结构 堆的核心概念 <java虚拟机规范>中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上. 一个JVM实例只存在一个堆内存(就是new 出来一个对象),ja ...