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

  1. python全栈开发day115、116-websocket、websocket原理、websocket加解密、简单问答机器人实现

    1.websocket 1.websocket 与轮询 轮询: 不断向服务器发起询问,服务器还不断的回复 浪费带宽,浪费前后端资源 保证数据的实时性 长轮询: 1.客户端向服务器发起消息,服务端轮询, ...

  2. WebSocket原理与实践(四)--生成数据帧

    WebSocket原理与实践(四)--生成数据帧 从服务器发往客户端的数据也是同样的数据帧,但是从服务器发送到客户端的数据帧不需要掩码的.我们自己需要去生成数据帧,解析数据帧的时候我们需要分片. 消息 ...

  3. WebSocket原理与实践(三)--解析数据帧

    WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义:   在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...

  4. WebSocket原理与实践(二)---WebSocket协议

    WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...

  5. WebSocket原理与实践(一)---基本原理

    WebSocket原理与实践(一)---基本原理 一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般 ...

  6. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

  7. websocket 原理

    自己写一个websocket import socket, hashlib, base64 sock = socket.socket() sock.bind(('127.0.0.1', 9000)) ...

  8. WebSocket原理说明

    WebSocket原理说明 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应 ...

  9. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

随机推荐

  1. QUIC协议原理分析(转)

    之前深入了解了一下HTTP1.1.2.0.SPDY等协议,发现HTTP层怎么优化,始终要面对TCP本身的问题.于是了解到了QUIC,这里分享一篇之前找到的有意义的文章. 原创地址:https://mp ...

  2. 10分钟明白对偶建模法 / +Leampms的“主模型建模”和“对偶模型建模” 之 —— 三类最短路径问题

    摘要 对偶模型建模是非常有独特的一种建模方式 —— 当问题本身要求指标极小的情况下,对偶模型表现为求极大.本文给出三种最短路径问题的线性规划/混合整数规划模型,其中的第三类最短路径问题采用对偶建模方法 ...

  3. ByteView和Sink

    久违啦米娜桑!!! 最近有点忙,一月有余没有更新了,实在对不起大家!!! 上线后看到不少朋友发的私信,感谢大家的赞许与信任,后面我会尽最大的努力按时更新,不断推出更优质的文章!!! 本来计划最后花1讲 ...

  4. Zuul之Filter详解

    Zuul详解 官方文档:https://github.com/Netflix/zuul/wiki/How-it-Works Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列 ...

  5. ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)

    之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键 ...

  6. .Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置

    新建控制台应用(.Net Core)程序 添加json文件,命名为appsettings.json,设置文件属性 如果较新则复制.添加内容如下 { "MyWords" : &quo ...

  7. c#用winform开发一个简易双色球项目

    开始画面 抽奖中: 抽奖结果: 需要一个随机数Random的帮助类,让随机数唯一性 public class RandomHelper { public int GetNum(int min, int ...

  8. 使用visualStudio2017创建一个简单的控制台程序

    步骤: 1.  打开visual studio开发工具 2. 选择文件>新建>项目 如下图所示: 3. 选择window金典桌面>控制台应用程序 并填写好想项目名称和选择项目存储地址 ...

  9. 对于jQuery的了解

    1.了解jQuery与JavaScript的区别 css --外貌特征Html --躯干,骨架js --运动神经 jQuery就是对JavaScript的一个拓展,封装,就是让JavaScript更好 ...

  10. Xamarin 开发Android应用简易教程(1)

    最近领导又安排了新的项目需求,只好学习学习如何在.net环境下开发APP(原来没有接触过App开发)! 1.安装VS2017移动应用开发模块. 2.使用VS2017,主要是便利,无需配置环境等一系列麻 ...