WebSocket原理
一 . WebSocket原理
1.1.背景
WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动请求。
1.2.相同点
1.都是基于TCP的应用层协议。
2.都使用Request/Response模型进行连接的建立。
3.在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。
4.都可以在网络中传输数据。
1.3.不同点
1.WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用。
2.WS的连接不能通过中间人来转发,它必须是一个直接连接。
3.WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据。
4.WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息。
5.WS的数据帧有序。
6.WebSocket 分为握手和数据传输
1.4.WebSocket的握手
客户端的握手如下:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13 服务端的握手如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat 客户端和服务端都发送了握手,并且成功,数据传输即可开始。
1.5.建立握手的时候需要遵守的规则
1.请求【握手】信息中提取 Sec-WebSocket-Key
2.利用magic_string 和 Sec-WebSocket-Key 进行sha1加密,再进行base64加密
3.将加密结果响应给客户端
# 注:magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11
1.6.数据传输
通过Http握手之后,如果是http 协议的话,tcp 连接会断开,这里在http 头部指明了升级为 websocket, 所以tcp 连接不断开。
WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范。 WebSocket 数据传输以数据帧的形式传输。
1.7.payload length:传输数据长度
# hashstr = b'\x81\x83\xceH\xb6\x85\xffz\x85'
# b'\x81 \x83 \xceH\xb6\x85\xffz\x85'
# print(hashstr[1]) #也就是打印\x83得到一个数字,这个数字与127做位运算,得到一个值:
如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;
如果这个值是126,则随后的两个字节表示的是一个16进制无符号数,用来表示传输数据的长度;
如果这个值是127,则随后的是8个字节表示的一个64位无符合数,这个数用来表示传输数据的长度。
二 . 轮询
# 轮询
客户端向服务器不断发起类似Http请求
服务器不断的响应客户端 带上你的身份牌 - 服务器校验身份
大爷去找你的消息 - 服务器获取你应该拿到数据
if:拿到数据
else:拿不到数据 - 再次发起请求询问服务器消息 劣势:
1.双端资源浪费
2.带宽资源占用
3.不能保证数据实时性 上个世纪90年代 - 本世纪初:
24bps == 4-6KB
CPU == 800MHZ
内存 == 256MB
QQ -- ICQ
三 . 长轮询
# 长轮询
1.客户端向服务器发起一个请求
2.服务器保持这个请求 不返回不响应
3.一定时间之后,服务器抛弃 or 返回
4.客户端收到请求 立即再次发起保持 你去传达室,大爷款待你喝茶,
喝茶等消息(保持)
上厕所或者大爷撵你走(断开)
再次回去喝茶等消息(保持) 劣势:
1.服务器资源浪费
2.不能保证数据实时性(可能在上厕所的时候来消息)
优势:
1.节省客户端资源(不用总去)
2.保证数据有效 当时的环境:本世纪初 - 目前
128bps == 20-30KB
Cpu == 1.4GHZ 奔腾4
内存 == 512MB
四 . 长连接
# 长连接
永久保持连接 1.你和大爷之间装了一台电话分机
2.你派人告诉大爷你的分机号码
3.大爷拨通分机
4.你告诉大爷,有消息说句话,我派人去拿
5.你和大爷同时开启了闭音(我平常说话你听不见) 劣势:
1.服务器CPU要求较高 优势:
1.节省大量资源
2.数据实时有效性
3.带宽几乎不占用 现在的环境:
100mps == 百兆光纤 == 5MB/s || 2KB
CPU == 16核32线程 i9 3.2GHZ
内存 == 16GB
WebSocket原理的更多相关文章
- python全栈开发day115、116-websocket、websocket原理、websocket加解密、简单问答机器人实现
1.websocket 1.websocket 与轮询 轮询: 不断向服务器发起询问,服务器还不断的回复 浪费带宽,浪费前后端资源 保证数据的实时性 长轮询: 1.客户端向服务器发起消息,服务端轮询, ...
- WebSocket原理与实践(四)--生成数据帧
WebSocket原理与实践(四)--生成数据帧 从服务器发往客户端的数据也是同样的数据帧,但是从服务器发送到客户端的数据帧不需要掩码的.我们自己需要去生成数据帧,解析数据帧的时候我们需要分片. 消息 ...
- WebSocket原理与实践(三)--解析数据帧
WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...
- WebSocket原理与实践(二)---WebSocket协议
WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...
- WebSocket原理与实践(一)---基本原理
WebSocket原理与实践(一)---基本原理 一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般 ...
- python 全栈开发,Day139(websocket原理,flask之请求上下文)
昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...
- websocket 原理
自己写一个websocket import socket, hashlib, base64 sock = socket.socket() sock.bind(('127.0.0.1', 9000)) ...
- WebSocket原理说明
WebSocket原理说明 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应 ...
- Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例
一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...
随机推荐
- QUIC协议原理分析(转)
之前深入了解了一下HTTP1.1.2.0.SPDY等协议,发现HTTP层怎么优化,始终要面对TCP本身的问题.于是了解到了QUIC,这里分享一篇之前找到的有意义的文章. 原创地址:https://mp ...
- 10分钟明白对偶建模法 / +Leampms的“主模型建模”和“对偶模型建模” 之 —— 三类最短路径问题
摘要 对偶模型建模是非常有独特的一种建模方式 —— 当问题本身要求指标极小的情况下,对偶模型表现为求极大.本文给出三种最短路径问题的线性规划/混合整数规划模型,其中的第三类最短路径问题采用对偶建模方法 ...
- ByteView和Sink
久违啦米娜桑!!! 最近有点忙,一月有余没有更新了,实在对不起大家!!! 上线后看到不少朋友发的私信,感谢大家的赞许与信任,后面我会尽最大的努力按时更新,不断推出更优质的文章!!! 本来计划最后花1讲 ...
- Zuul之Filter详解
Zuul详解 官方文档:https://github.com/Netflix/zuul/wiki/How-it-Works Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列 ...
- ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)
之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键 ...
- .Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置
新建控制台应用(.Net Core)程序 添加json文件,命名为appsettings.json,设置文件属性 如果较新则复制.添加内容如下 { "MyWords" : &quo ...
- c#用winform开发一个简易双色球项目
开始画面 抽奖中: 抽奖结果: 需要一个随机数Random的帮助类,让随机数唯一性 public class RandomHelper { public int GetNum(int min, int ...
- 使用visualStudio2017创建一个简单的控制台程序
步骤: 1. 打开visual studio开发工具 2. 选择文件>新建>项目 如下图所示: 3. 选择window金典桌面>控制台应用程序 并填写好想项目名称和选择项目存储地址 ...
- 对于jQuery的了解
1.了解jQuery与JavaScript的区别 css --外貌特征Html --躯干,骨架js --运动神经 jQuery就是对JavaScript的一个拓展,封装,就是让JavaScript更好 ...
- Xamarin 开发Android应用简易教程(1)
最近领导又安排了新的项目需求,只好学习学习如何在.net环境下开发APP(原来没有接触过App开发)! 1.安装VS2017移动应用开发模块. 2.使用VS2017,主要是便利,无需配置环境等一系列麻 ...