WebSocket协议

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

可以对照着这个报文来看

General:
Request URL: ws://192.168.0.104:8000/ws/admin/
Request Method: GET
Status Code: 101 Switching ProtocolsResponse Headers:
Connection: Upgrade
Sec-WebSocket-Accept: 2AoLKibh+f+uMBBcbiS8I2or8Gw=
Server: Daphne
Upgrade: WebSocketRequest headers:
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: Upgrade
Cookie: csrftoken=u4xfXVwoDR26wKzKChfHO0srE06phmAPOsxiAM6O13wypNY0RsoyTgi7JpHrQQy5; sessionid=wt20pel1fhojibrqylgn3y9jpouvhj4n
Host: 192.168.0.104:8000
Origin: http://192.168.0.104:8000
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: RG7L4nO1IRMXGWBqTsY/lw==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36

请求头中的重要字段

  • Connection和Upgrade:表示客户端发起的是WebSocket请求
  • Sec-WebSocket-Version:客户端所使用的的WebSocket协议版本号,服务端会确认是否支持该版本号
  • Sec-WebSocket-Key:一个Base64编码值,由浏览器随机生成,用于升级request
  • Sec-WebSocket-Extensions客户端想表达的协议级的扩展

响应头中的重要字段

  • Status Code 101 Switching Protocols:切换协议,WebSocket协议通过HTTP协议来建立运输层的TCP连接
  • Connection和Upgrade:表示服务端返回的是WebSocket响应
  • Sec-WebSocket-Accept:表示服务器接受了客户端的请求,由Sec-WebSocket-Key计算得来

验证Sec-WebSocket-Key和Sec-WebSocket-Accept的关系

MDN:Protocol upgrade mechanism这篇文档中提到

If a Sec-WebSocket-Key header was provided, the value of this header is computed by taking the value of the key, concatenating the string “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” to it, taking the SHA-1 hash of that concatenated string, resulting in a 20-byte value. That value is then base64 encoded to obtain the value of this property.

那我们进入到python环境中验证一下

cws@mypc:~$ python3
Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> text = "RG7L4nO1IRMXGWBqTsY/lw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
>>> import hashlib
>>> import base64
>>> h = hashlib.sha1(text.encode())
>>> h.digest()
b'\xd8\n\x0b*&\xe1\xf9\xff\xae0\x10\\n$\xbc#j+\xf0l'
>>> base64.b64encode(h.digest())
b'2AoLKibh+f+uMBBcbiS8I2or8Gw='
>>>

可以看到,请求头中Sec-WebSocket-Key拼接上字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"的经过运算后得到的'2AoLKibh+f+uMBBcbiS8I2or8Gw='正好就是响应头中的Sec-WebSocket-Accept

WebSocket协议的优缺点及应用场景

优点

  • 支持双向通信,实时性更强
  • 数据格式比较轻量,性能开销小,通信高效。
  • 支持扩展。用户可以扩展协议或者实现自定义的子协议(比如支持自定义压缩算法等)

缺点

  • 少部分浏览器不支持,浏览器支持的程度与方式有区别
  • 长连接对后端处理业务的代码稳定性要求更高,后端推送功能相对复杂
  • 成熟的HTTP生态下有大量的组件可以复用,WebSocket较少

应用场景

  • 即时聊天通信,网站消息通知
  • 在线协同编辑,如腾讯文档
  • 多玩家在线游戏、视频弹幕、股票基金实时报价

WebSocket的初步认识相关推荐

  1. websocket autobahn webrtc

    最近分析webrtc android 的交互流程(房间服务器.信令.穿透等),发现webrtc是使用的是autohahn 的 websocket,初步看了下发现这个库封装的很不错,就分享出来,下面的 ...

  2. Soul网关源码分析-环境搭建

    1.下载源码,搭建soul运行环境 源码下载地址:https://github.com/dromara/soul 1)先把源码克隆下来: git clone git@github.com:dromar ...

  3. 【转】WebSocket详解(一):初步认识WebSocket技术

    1.前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大 ...

  4. WebSocket详解(一):初步认识WebSocket技术

    WebSocket详解(一):初步认识WebSocket技术 1.前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广 ...

  5. WebSocket笔记(一) 初步认识

    原文:http://zhangxiao.org/2018/WebSocket/intro/ 使用场景 服务器,需要向客户端主动端推送消息(数据) 客户端,需要实施获取服务器上数据更新或变化 基本概念 ...

  6. rudesocket如何使用_[WebSocket入门]手把手搭建WebSocket多人在线聊天室(SpringBoot+WebS...

    前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: 本文内容摘要: 初步理解WebSocket的前后端交互逻辑 手把手使用 SpringBoot ...

  7. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  8. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    摘要 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯 方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server- ...

  9. java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码

    解决 JAVA WebSocket 解析 base64 后中文字符串乱码 解决 JAVA WebSocket 解析 base64 后中文字符串乱码 春风如贵客,一到便繁华.各位看官先赞再看,养成好习惯 ...

最新文章

  1. java redis使用卡死_记一次找因 redis 使用不当导致应用卡死 bug 的过程
  2. CF Vicious Keyboard 构造水题
  3. 《无线网络:理解和应对互联网环境下网络互连所带来的挑战》——第2章 无线生态系统 2.1无线标准化过程...
  4. FIFO、UART、ALE解释
  5. opencv获得图片的像素宽度_OpenCV中获取图像某一像素值
  6. 如何排查Java内存泄露(内附各种排查工具介绍)
  7. linux重定向到某目录文件,linux shell中12 21 1file_path重定向语法详解
  8. php用date表示本月,用php获取本周,上周,本月,上月,本季度日期的代码
  9. 给C/C++/Java等程序生成API文档
  10. 8153网卡linux驱动,绿联Type-c千兆网卡RTL8153驱动
  11. 项目组合、项目集、项目管理实践经验及思考
  12. Word文档中去除EndNote格式
  13. 电脑重装系统之后MySQl如何恢复
  14. 2021年全球氨基酸表面活性剂市场规模大约为47亿元(人民币),预计2028年将达到105亿元
  15. thinkphp Malformed UTF-8 characters, possibly incorrectly encoded报错解决方案
  16. 达人评测 r7 7730u和i5 12500h差距 锐龙r77730u和酷睿i512500h对比
  17. /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
  18. BI神器Power Query(13)-- PQ制作时间维度表(2)
  19. My_sum函数进化
  20. 美国加州中学课本 教材介绍 - Glencoe系列- 美国初中语文 数学 科学 健康

热门文章

  1. 大型网站的架构演进从一个电商网站开始
  2. 走过的弯路,你的套路
  3. MapReduce运行机制-Map阶段
  4. 什么是Eureka注册中心
  5. Redisson初始化
  6. 反向传播算法_反向传播算法:定义,概念,可视化
  7. linux 基本指令
  8. java 分布式电子商务云平台b2b b2c o2o需要准备哪些技术??
  9. Windows server 2008R2 DHCP服务器
  10. 开发人员学Linux(2):VirtualBox中安装CentOS7系统设置