即时通讯系列: WebSocket从原理到企业项目技术选型(2)

简介: 阅读本篇可能需要的预备知识 《试图取代 TCP 的 QUIC 协议到底是什么》、《抓包与反抓包》、《趣谈网络协议》

四. webSocket 基础概念

4.1.1 websocket是什么?

websocket是一种基于 TCP 的轻量级网络通信协议,位于七层协议的应用层协议,必须依赖HTTP协议进行第一次握手 , 握手成功之后数据直接从TCP通道传输,此时就和HTTP无关了

4.1.2 websocket的特点?

   websocket 使用二进制帧,结构比较简单,特殊的地方是有个“掩码”操作,客户端发数据必须掩码,服务器则不用, websocket 就可以“伪装”成HTTP 协议,比较容易地“穿透”防火墙,与服务器建立连接, 这样服务器就可以变得更加“主动”了。一旦后台有新的数据,就可以立即“推送”给客户端,不需要客户端轮询,“实时通信”的效率也就提高了

4.1.3 websocketHttp的异同?

image.png

相同点
  • 都是基于TCP 协议
  • 都有加密传输 ws 和 wss , http 和 https
  • 都是应用层协议

不同点
  • http 每次请求-应答都需要客户端与服务端建立连接的模式, 是单向协议
  • websocket 是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

4.1.4 websocket 常见状态信息?

General
Request URL: ws://127.0.0.1/echo
Request Method: GET
Status Code: 101 Switching Protocols
Response Headers // 响应头
HTTP/1.1 101 Switching Protocols // 101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求
Upgrade: websocket // 须设置成 websocket 表示升级为websocket 协议
Connection: Upgrade // 连接状态.upgrade 表示请求升级
Sec-WebSocket-Accept: c/LP8JsVmZWV/EB3lgGDVmVQWVA= // 响应给客户端的值
Request Headers // 请求头
GET ws://127.0.0.1/echo HTTP/1.1 // 请求方法
Host: 127.0.0.1 // 主机
Connection: Upgrade // 连接状态.upgrade 表示请求升级
Pragma: no-cache // 没有缓存
Cache-Control: no-cache // 缓存状态
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Upgrade: websocket
Origin: http://127.0.0.1:5500
Sec-WebSocket-Version: 13 // websocket 当前版本信息
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Sec-WebSocket-Key: rRXp2i/XCuCsKqs5MN12Ag== // 发给服务端的随机字符串
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

4.1.5 为什么要使用webSocket?

  • 带宽
  • webSocket相对于http来说协议头更加小,同时按需传递。
  • 数据实时性
  • webSocket相对于轮询和长轮询来说,能够实时传递数据,延迟更小。
  • 状态问题
  • 相较于http的无状态请求,WebSocket在建立连接后能够维持特定的状态。

五. webSocket连接协议

  我们给长连接中实际发的每个包都定义了固定的格式,根据这样定下来的协议才能保证客户端和服务端的解析不会出错。

  每个包分为协议头和协议内容两部分

六. webSocket在Android客户端的架构

6.1 连接层

  连接层主要包含连接和协议处理的基本功能,确保长连接建立后的正常使用和异常处理

6.2 业务层

  业务层包含了服务端对连接要求Config包收发处理和重试的逻辑

image.png

七. im app webSocket之技术选型

OkHttp + WebSocket

image.png

 选择成熟的技术方案可以减少踩坑的概率,随着H5标准出来的WebSocket经过这几年发展已经应用到非常多的方面,比起自己开发新的协议,使用WebSocket可以大大减少开发量,也能避免很多不必要的bug,现在公司我们大都接入了OkHttp库,已经自带相应包。


  并且作为Android官方选择的库,OkHttp和OkIo非常稳定且性能优秀,WebSocket库独立拆出来也非常小,使用方便,因此作为最终选择的依赖库,Http我们都知道是什么,


  1.0版本的Http只能是客户端给服务端发请求并接收回应包,如果要继续通讯,则需要在此发起请求,1.1版本增加了keep-alive的Header(默认打开),可以保持连接不用重新建立连接。在Http协议下,要达到服务端通知客户端的效果,只能使用轮询或者阻塞的方式来实现。


  WebSocket基于TCP协议实现,并复用了Http的握手协议来完成连接操作,通过Upgrade和Connection来告诉服务端,这个连接是一个高大上的WebSocket连接,而不是那个单向的Http

相关文章
|
缓存 移动开发 网络协议
WebSocket 协议原理抓包分析
WebSocket 协议原理抓包分析
548 0
|
移动开发 网络协议 NoSQL
.NET Core WebSocket实现简易、高性能、集群即时通讯组件
.NET Core WebSocket实现简易、高性能、集群即时通讯组件
343 0
|
7月前
|
移动开发 缓存 网络协议
Websocket协议原理及Ws服务器代码实现
Websocket协议原理及Ws服务器代码实现
|
2月前
|
安全 JavaScript 网络协议
WebSocket通信协议基础原理与安全威胁
WebSocket通信协议基础原理与安全威胁
84 0
|
3月前
|
安全 JavaScript 网络协议
WebSocket通信协议基础原理与安全威胁
WebSocket通信协议基础原理与安全威胁
56 7
|
3月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
62 2
|
4月前
|
缓存 JavaScript 前端开发
为开源项目 go-gin-api 增加 WebSocket 模块
为开源项目 go-gin-api 增加 WebSocket 模块
49 2
|
4月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
5月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
【7月更文挑战第18天】在Python的Flask框架中,结合Flask-SocketIO库可轻松实现WebSocket实时通信,促进前后端分离项目中的高效交互。示例展示了一个简单的聊天应用:Flask路由渲染HTML,客户端通过Socket.IO库连接服务器,发送消息并监听广播。此方法支持多种实时通信协议,适应不同环境,提供流畅的实时体验。
100 3
|
7月前
|
消息中间件 前端开发 JavaScript
【前端】websocket 讲解与项目中的使用
【前端】websocket 讲解与项目中的使用