云原生——Web实时通信技术之Websocket

 “文章对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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是羽十八ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值