四. webSocket
基础概念
4.1.1 websocket
是什么?
websocket
是一种基于 TCP 的轻量级网络通信协议,位于七层协议的应用层协议,必须依赖HTTP协议进行第一次握手 , 握手成功之后数据直接从TCP通道传输,此时就和HTTP无关了
4.1.2 websocket
的特点?
websocket
使用二进制帧,结构比较简单,特殊的地方是有个“掩码”操作,客户端发数据必须掩码,服务器则不用, websocket
就可以“伪装”成HTTP
协议,比较容易地“穿透”防火墙,与服务器建立连接, 这样服务器就可以变得更加“主动”了。一旦后台有新的数据,就可以立即“推送”给客户端,不需要客户端轮询,“实时通信”的效率也就提高了
4.1.3 websocket
和Http
的异同?
相同点
- 都是基于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包收发处理和重试的逻辑
七. im app webSocket
之技术选型
OkHttp
+ WebSocket
选择成熟的技术方案可以减少踩坑的概率,随着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