Web实时通信技术之Websocket

举报
是羽十八ya 发表于 2022/07/02 15:01:55 2022/07/02
【摘要】   “文章对Websocket进行了介绍以及归纳小结(含python编程代码)。”

  “文章对Websocket进行了介绍以及归纳小结(含python编程代码)。”


引读

  • 为什么要引入Websocket?
  • ——因为在HTTP之中,服务端无法向客户端主动推送更新的资源
  • PS:HTTP/2 只能推送静态资源(预置资源),无法推送实时更新的信息
  • HTTP——连接建立-客户端请求-服务器响应(无请求则服务器不响应)
  • Websocket——实现客户端-服务器双向对等通信(服务器和客户端都可以主动发送消息)

  • 全双工协议(全双工——通信数据允许同时在两个方向上传输,半双工——通信数据同一时间内只允许在一个方向上传输,单工——通信数据固定只能在一个方向上传输)
  • Websocket——全双工协议
  • 典型应用:弹幕系统

Websocket:长期占用主机端口

HTTP请求:监听端口并通过端口进行信息传输

  • 传统HTTP更新信息的方法:
  • 轮询 / 长连接

  • 很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。


Websocket介绍

基础

  • Websocket与HTTP和HTTPS使用相同的TCP端口,可以绕过大多数防火墙的限制。默认情况下,Websocket协议使用80端口;运行在TLS之上时,默认使用443端口。

  • 建立WebSocket 连接

    • 客户端浏览器向服务器发起HTTP 请求(包含更新的头部信息的请求)

    • 服务器端解析——产生应答信息表示升级成功

    • 连接成功建立——端到端通信——直到某一方发起关闭请求

  • 在握手环节之中,Websocket比HTTP多进行一次握手,更新信息(服务器响应状态码101表示),如下图所示

  • 客户端消息:

  • 服务端消息:

编辑

  • Connection必须设置Upgrade,表示客户端希望连接升级。
  • Upgrade字段必须设置Websocket,表示希望升级到Websocket协议。
  • Origin:作安全使用,防止跨站攻击,浏览器一般会使用这个来标识原始域。

Python Websocket搭建

  • 服务端搭建代码:

import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
message = "I got your message: {}".format(message)
await websocket.send(message)
asyncio.get_event_loop().run_until_complete(
websockets.serve(echo, '127.0.0.1', 8766))
asyncio.get_event_loop().run_forever()
  • 客户端搭建代码:
import asyncio
import websockets
async def echo(uri):
async with websockets.connect(uri) as websocket:
while True:
message = input("Write down your message:")
await websocket.send(message)
print("<", message)
recv_text = await websocket.recv()
print("> {}".format(recv_text))
asyncio.get_event_loop().run_until_complete(
echo('ws://127.0.0.1:8766'))
  • 客户端进行连接服务端,服务端接受连接之后双方建立了一个端对端的TCP连接,在该连接上可以实现双向通讯,建立这个连接之后,通信双方就没有客户端服务端之分了,提供的就是端对端通信。

Websocket VS HTTP

  • Websocket的连接不能通过代理,必须直连
  • Websocket建立之后,通信双方在任意时刻都可以主动通信
  • Websocket建立之后通过数据帧传输信息,不使用请求-响应结构
  • Websocket数据帧有序

优点

  • 较少的控制开销。在连接建立后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
  • 实时性强:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
  • 更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  • 支持扩展协议。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
  • 有状态协议(对比HTTP无状态)。与HTTP不同,Websocket需要先建立连接,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如cookies等)。
  • WebSocket不受浏览器同源策略的限制
  • WebSockets 适用于实时性要求高的应用、聊天室、多人游戏、实时文档协作等

缺点

  • 服务器长期维护长连接需要成本高
  • 高并发场景之下对通信双方要求高
  • 占用多个进程端口且一般浏览器有限制(例如:firefox为200)
  • WebSocket握手阶段容易出现安全问题(Hijacking)

参考资料

 https://zh.m.wikipedia.org/zh-hans/WebSocket

 http://www.52im.net/thread-1266-1-1.html

 Websocket在线测试网站(抓包用)

💗 “逐梦的伤痕与印记才是少年独有的勋章,长风破浪终有时,享受过程,酸甜苦辣共存,才是人生。” 

                                                                ——Created By 是羽十八ya

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。