详解 websocket

目录

一、什么是websocket

二、websocket 的用途

三、websocket 特点

四、websocket 帧

五、websocket URL 格式

六、发送消息

七、关闭会话的方式

八、关闭帧错误码

九、简单的websocket 代码


一、什么是websocket

WebSocket该协议在规范RFC 6455中进行了描述,它提供了一种通过持久连接在浏览器和服务器之间交换数据的方法。数据可以作为“数据包”双向传递,而无需中断连接或发出额外的 HTTP 请求。

为啥不用HTTP1.1 呢,HTTP1.1的双向通信只能通过轮询,会浪费很多网络资源,因为每次都需要tcp的三次握手以及四次挥手。而且HTTP1.1不能从server到client 进行消息推送,消息的实时性得不到保证。

二、websocket 的用途

WebSocket 特别适合需要连续数据交换的服务。例如,网络游戏和实时交易系统。

WebSocket 在网络会议里有广泛应用:可以用作网络会议前检查人数的计数器或者用作会议期间发送材料和文件的平台,会议期间的发言内容

三、websocket 特点

  1. 双向通信:优劣,优点是消息的实时性,缺点是伸缩性非常差比如增加服务器

  2. 管理会话:双向关闭会话

  3. 维持长链接:websocket 是通过ping,pong 发心跳维持长链接而.http1.1 是通过keeplive

  4. 兼容HTTP协议:端口复用 ws 是80端口,wss 是443 端口

  5. 支持扩展:如per message-deflate 扩展

  6. Http 协议头部存放元数据,websocket 传输的应用层存放元数据

  7. 是基于帧而不是基于流(HTTP,TCP)每一帧要么承载字符数据要么承载二进制数据

  8. 基于浏览器的同源策略模型(非浏览器无效)可以使用Access-Control-Allow-Origin 等头部

  9. 基于URI、子协议支持同主机同端口上的多个服务、

四、websocket 帧

  1. RSV1、RSV2、RSV3 :默认为0,仅当使用extension 扩展时,有扩展决定其值9

  2. opcode 是帧的类型:持续帧 0 继续前一帧,非控制帧 1 是文本帧(UTF8)2 二进制帧 3-7 为非控制帧保留,控制帧

    8关闭帧 9 心跳帧ping A 心跳帧pong B-F 为控制帧保留

  3. FIN 表示消息的结尾

  4. 消息长度内容长度:消息长度由应用消息长度和扩展数据长度组成,<=125 字节仅使用Payload len,126 至2^16-1 字节

    Payload len值为126 Extended payload length 16 位表示长度。2^16 至 2^64-1 Payload len 值为127 Extended payload length 共8字节64位表示长度

5、frame-masking-key 掩码:客户端消息:MASK 为1(包括控制帧),传递32位无法预测的、随机的Masking-key.服务器端消息:MASK 为0 ,可以防止缓存代理污染攻击

它是如何做到的呢强制浏览器执行以下方法:

生成随机的32位frame-masking-key,不能让JS 代码猜出(否则可以反向构造)

对传输的包体按照frame-masking-key 执行可对称解密的XOR异或操作,使代理服务器不识别

6、心跳帧可以插在数据帧中传输:ping 帧 opcode=9 可以包含数据 pong 帧 opcode=A 必须与ping帧数据相同

五、websocket URL 格式

ws-URL= "ws:" "//" host [":"port] path ["?" query] 默认port 端口80

wss-URL="wss:" "//" host [":"port] path ["?" query] 默认port 端口443

客户端提供信息

1、host 与 port 主机名与端口

2、shame:是否基于SSL

3、访问资源:URL

4、握手随机数:Sec-websocket-key

5、选择子协议:Sec-websocket-Protocol

6、扩展协议:Sec-websocket-Extensions

7、CORS 跨域:Origin

六、发送消息

  1. 确保WebSocket 会话处于OPEN状态

  2. 以帧来承载消息,一条消息可以拆分多个数据帧

  3. 客户端发送的帧必须基于掩码编码

  4. 一旦发送或者接收到关闭帧,链接处于CLOSING 状态

  5. 一旦发送了关闭帧,且接收到了关闭帧,链接处于CLOSED 状态

  6. TCP 连接关闭后,WebSocket 连接才完全被关闭

七、关闭会话的方式

控制帧中的关闭帧:在TCP连接上的双向关闭,发送关闭帧后,不能再发送任何数据。接收到关闭帧后,不再接收任何到达的数据

关闭帧可以含有数据,但仅用于解释关闭会话的原因,前2字节为无符号整型,遵循mask 掩码规则

八、关闭帧错误码

九、简单的websocket 代码

server

http.HandleFunc("/ws", func(writer http.ResponseWriter, request *http.Request) {
   //http 请求升级为websockt 请求
   u := websocket.Upgrader{
      CheckOrigin: func(r *http.Request) bool {
         return true
      },
   }
   c, err := u.Upgrade(writer, request, nil)
   if err != nil {
      return
   }
   defer c.Close()
   done := make(chan struct{})
  // 从客户端接收消息
   go func() {
      for {
         m := make(map[string]interface{})
         err := c.ReadJSON(&m)
         if err != nil {
            fmt.Printf("connot read json:%v\n", err)
            done <- struct{}{}
            break
         }
         fmt.Println(err)
      }
​
   }()
   // 发送消息到客户端
   i := 0
   for {
      i++
      err := c.WriteJSON(map[string]string{
         "hello":  "websocket",
         "msg_id": strconv.Itoa(i),
      })
      if err != nil {
         fmt.Println(err)
      }
      select {
      case <-time.After(200 * time.Millisecond):
      case <-done:
         return
      }
      time.Sleep(1 * time.Second)
   }
​
})
http.ListenAndServe(":8081", nil)

client

<script>
    var ws = new WebSocket("ws://localhost:8081/ws")
    ws.open = function (evt){
      ws.send("dfsffdsdf")
    }
    ws.onmessage = function (evt){
        console.log(evt.data)
    }
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络原理TCP/IP(1)

在网络通信中&#xff0c;协议非常重要 协议进行了分层 应用层就是对应着应用程序&#xff0c;是程序员打交道最多的这一层&#xff0c;调用系统提供的网络api写出来的代码都是属于应用层的 应用层有很多现成的协议&#xff0c;但是更多的还是程序员需要根据实际场景自定义协议…

服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

知识点&#xff1a; 1、端口协议-弱口令&未授权&攻击方式等 2、桌面应用-社交类&文档类&工具类等 章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数据库&中间件&…

ComposeForDesktop之gradle下载器

文章 目录 前言一、简要的代码片段二、小工具获取 前言 最近使用gradle编译安卓的时候又出现了gradle下载超时的问题&#xff0c;经常性地手动下载再复制到目录&#xff0c;确实每次都做&#xff0c;每次都很繁琐。 于是有了今天这个软件地诞生&#xff0c;先放个截图。 一…

C++面试宝典第26题:螺旋矩阵

题目 给你一个正整数n,生成一个包含1到n的平方的所有元素,且元素按顺时针顺序螺旋排列成n x n的正方形矩阵。 示例: 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 解析 螺旋矩阵是指按照顺时针(或逆时针)螺旋顺序排列元素的二维矩阵。比如:给定一个如下的3x3矩阵,按顺…

2024美赛数学建模F题思路分析 - 减少非法野生动物贸易

1 赛题 问题F&#xff1a;减少非法野生动物贸易 非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c;…

jupyter notebook显示的扩展很少,只有四五个--解决方案

如下&#xff1a;安装好只有四五个扩展 可以先删除 conda remove jupyter_nbextensions_configurator 然后使用pip安装 pip install jupyter_contrib_nbextensions jupyter contrib nbextensions install --user pip install jupyter_nbextensions_configurator jupyter nbex…

ChatGPT真有很多人在用吗?——回答一位知友的问题

先上结论 是的。数据不会撒谎&#xff0c;用户拿脚投票&#xff0c;ChatGPT发布仅五天内就达到了100万用户&#xff0c;是有史以来增长最快的消费者应用程序。2023年全球前50款AI工具就收获了240亿次访问&#xff0c;其中ChatGPT收获了146亿次访问。 一些想法和思考 我的一些…

linux有关安全的几个基本配置,禁止root登录,新建root权限账号

一、不安装多余的软件&#xff0c;能最小化安装就不要安装图形化界面&#xff0c;然后根据需求安装需要的软件。 二、防火墙要启用&#xff0c;如果您的这台服务器对外有服务只要放开服务就好了&#xff0c;就是说白了白名单&#xff0c;切忌一上来第一件事儿就是关闭防火墙&a…

three.js CSS2DRenderer、CSS2DObject渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"><…

Django响应(一)

一、HttpResponse与JsonResponse 1.1、HttpResponse 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/request-response/#django.http.HttpResponse 返回给浏览器端的响应对象 from django.http import HttpResponse response = HttpResponse("Heres the text o…

数据结构+算法(第09篇):菜鸟也能“种”好二叉树!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

2023年网信办约谈了上万家网站

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 网信办发布公告&#xff1a; 网信办在共约谈网站 10646 家;责令 453 家网站暂停功能或更新;下架移动应用程序 259 款;关停小程序 119 款;取消违法网站许可或备案、关闭违法网站 14624 家;关闭违法违规账号 127878 个…

windows 谷歌浏览器Chrome 怎么禁止更新

1.首先把任务管理器里的谷歌浏览器程序结束&#xff1a; &#xff08;鼠标在任务栏右击&#xff0c;出现任务管理器&#xff09; 2.windowr&#xff0c;输入services.msc 带有Google Update的服务&#xff0c;选择禁用。 3.windowr&#xff0c;输入taskschd.msc 任务计划程序…

CTF-WEB进阶与学习

PHP弱类型 在进行比较的时候&#xff0c;会先判断两种字符串的类型是否相等&#xff0c;再比较 在进行比较的时候&#xff0c;会先将字符串类型转化成相同&#xff0c;再比较 如果比较一个数字和字符串或者比较涉及到数字内容的字符串&#xff0c;则字符串会被转换成数值 并且…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

如何分辨坏信息?

每当有社会热点&#xff0c;大家也许都会遇到一个困扰&#xff1a; 铺天盖地的信息&#xff0c;实在是太多了。究竟哪一些值得信任&#xff0c;哪些不值得信任&#xff1f;哪些可以接受&#xff0c;哪些最好保持怀疑&#xff1f; 我想用这篇文章&#xff0c;彻底把这个问题讲清…

day32 买卖股票的最佳时机Ⅱ 跳跃游戏 跳跃游戏Ⅱ

题目1&#xff1a;122 买卖股票的最佳时机Ⅱ 题目链接&#xff1a;122 买卖股票的最大时机Ⅱ 题意 整数数组prices[i]表示某股票的第i天的价格&#xff0c;每天可买卖股票且最多持有1股股票&#xff0c;返回最大利润 利润拆分&#xff0c;拆分为每天的利润 每天的正利…

【演讲比赛流程管理系统(C++版)】

一、演讲比赛程序需求 1.1、比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛 每名选手都有对应的编号&#xff0c;如10001~10012 比赛方式:分组比赛&#xff0c;每组6个人 第一轮分为两个小组&a…

银行数据仓库体系实践(18)--数据应用之信用风险建模

信用风险 银行的经营风险的机构&#xff0c;那在第15节也提到了巴塞尔新资本协议对于银行风险的计量和监管要求&#xff0c;其中信用风险是银行经营的主要风险之一&#xff0c;它的管理好坏直接影响到银行的经营利润和稳定经营。信用风险是指交易对手未能履行约定契约中的义务而…

力扣热门100题刷题笔记 - 2.两数相加

力扣热门100题 - 2.两数相加 题目链接&#xff1a;2.两数相加 题目描述&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返…