即时通讯系列: 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

相关文章
|
7月前
|
缓存 移动开发 网络协议
WebSocket 协议原理抓包分析
WebSocket 协议原理抓包分析
314 0
|
8月前
|
移动开发 网络协议 NoSQL
.NET Core WebSocket实现简易、高性能、集群即时通讯组件
.NET Core WebSocket实现简易、高性能、集群即时通讯组件
141 0
|
8天前
|
移动开发 缓存 网络协议
Websocket协议原理及Ws服务器代码实现
Websocket协议原理及Ws服务器代码实现
|
6天前
|
消息中间件 前端开发 JavaScript
【前端】websocket 讲解与项目中的使用
【前端】websocket 讲解与项目中的使用
|
9月前
|
监控 网络协议 数据可视化
Websocket原理和实践
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
313 0
Websocket原理和实践
|
10月前
|
网络协议 JavaScript
WebSocket全部内容及项目经验(二)
Socket.readyState: 只读属性 readyState 表示连接状态。 Socket.bufferedAmount: 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。 下面的代码展示一个使用bufferedAmount 特性每秒发送更新的例子。如果网络无法承受这一速率,它会相应作出调整。
|
10月前
|
移动开发 网络协议 大数据
WebSocket全部内容及项目经验(一)
在websocket未出来之前,实现实时数据更新都是采用轮询http请求实现的,很明显这种方式有很大的缺陷,一条数据就需要发一次http请求。HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
|
10月前
|
前端开发 Java
在项目中使用WebSocket进行前后端通信
在项目中使用WebSocket进行前后端通信
227 0
|
移动开发 安全 小程序
即时通讯技术文集(第14期):WebSocket精华文章合集 [共15篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第14 期。
65 0
|
Web App开发 移动开发 前端开发
WebSocket 是什么原理?为什么可以实现持久连接?
额。。最高票答案没答到点子上,最后怎么跑到Nodejs上去了。。Websocket只是协议而已。。 我一个个来回答吧
92 0