SRWebSocket

时间:2023-03-08 17:56:39

以前有个项目里有做聊天室,就是用的SRWebSocket。现在整理下资料,主要是对网上搜索到的资料进行整合。

WebSocket介绍,与Socket的区别

https://blog.****.net/wwd0501/article/details/54582912

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。

在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。

WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。

WebSocket则是一个典型的应用层协议。

Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。

iOS平台有哪些WebSocket和Socket的开源框架

Socket开源框架有:CocoaAsyncSocketsocketio/socket.io-client-swift
WebSocket开源框架有:facebook/SocketRockettidwall/SwiftWebSocket

  • WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——可以通俗的解释为服务器主动发送信息给客户端。

  • 区别于MQTT、XMPP等聊天的应用层协议,它是一个传输通讯协议。它有着自己一套连接握手,以及数据传输的规范。

SRWebSocket 源码分析:https://www.jianshu.com/p/cdb7a886789a

QOS机制

QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力, 是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。

它提供了三个选项

最多发送一次,至少发送一次,精确只发送一次

  • QOS(0),最多发送一次:如果消息没有发送过去,那么就直接丢失。
  • QOS(1),至少发送一次:保证消息一定发送过去,但是发几次不确定。
  • QOS(2),精确只发送一次:它内部会有一个很复杂的发送机制,确保消息送到,而且只发送一次。

心跳机制:

心跳就是用来检测TCP连接的双方是否可用

这里我们需要说明的是TCPKeepAlive机制只能保证连接的存在,但是并不能保证客户端以及服务端的可用性.

如:某台服务器因为某些原因导致负载超高,CPU 100%,无法响应任何业务请求,但是使用 TCP 探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态。

这时候心跳机制就起到作用了:

我们客户端发起心跳Ping(一般都是客户端),假如设置在10秒后如果没有收到回调,那么说明服务器或者客户端某一方出现问题,这时候我们需要主动断开连接

服务端也是一样,会维护一个socket的心跳间隔,当约定时间内,没有收到客户端发来的心跳,我们会知道该连接已经失效,然后主动断开连接。

PingPong机制:

  1. ping
  • Ping帧操作码(opcode)0x9。可以包含“应用数据
  • 当收到一个Ping帧时,接收方必须在响应中发送一个Pong帧,除非它早已接收到一个关闭帧。它应该尽可能快地以Pong帧响应。(也用来验证远程端点是否可响应)
  1. Pong
  • Pong帧操作码(opcode)0x9。
  • 一个Pong帧必须携和被响应的Ping帧中相同的数据
  • 如果再一个ping到达服务端,服务端尚未响应前,由到达同源的ping帧,则可以只响应最新的ping帧,
  • 未收到ping也可以发送一个Pong帧。这个充当单向的心跳(heartbeat),另一方不需要响应。

当服务端发出一个Ping,客户端没有在约定的时间内返回响应的ack,则认为客户端已经不在线,这时我们Server端会主动断开Scoket连接,并且改由APNS推送的方式发送消息。

同样的是,当客户端去发送一个消息,因为我们迟迟无法收到服务端的响应ack包,则表明客户端或者服务端已不在线,我们也会显示消息发送失败,并且断开Scoket连接。

CocoaSyncSockt的例子所讲的获取消息超时就断开吗?其实它就是一个PingPong机制的客户端实现。我们每次可以在发送消息成功后,调用这个超时读取的方法,如果一段时间没收到服务器的响应,那么说明连接不可用,则断开Scoket连接

重连机制:

理论上,我们自己主动去断开的Scoket连接(例如退出账号,APP退出到后台等等),不需要重连。其他的连接断开,我们都需要进行断线重连。

一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。

心跳机制、PingPong机制、断线重连机制、还有我们后面所说的QOS机制。这些被用来保证连接的可用,消息的即时与准确的送达等等。

上述内容保证了我们IM服务时的可靠性,其实我们能做的还有很多:比如我们在大文件传输的时候使用分片上传、断点续传、秒传技术等来保证文件的传输。

我们通常还需要一些安全机制来保证我们IM通信安全。

例如:防止 DNS 污染、帐号安全、第三方服务器鉴权、单点登录等等

类似微信,服务器不做聊天记录的存储,只在本机进行缓存,这样可以减少对服务端数据的请求,一方面减轻了服务器的压力,另一方面减少客户端流量的消耗。我们进行http连接的时候尽量采用上层API,类似NSUrlSession。而网络框架尽量使用AFNetWorking3。因为这些上层网络请求都用的是HTTP/2 ,我们请求的时候可以复用这些连接。