WebSocket That You Should Know
一些基本概念
长连接: 连接建立后,需要通过心跳继续维持连接,这样发消息的时候不用每次都建立连接。其通信的过程为,建立连接 --> 数据传输 --> 维持心跳 --> 数据传输 --> 关闭连接。相当于自己要维护一个心跳来确保客户端和服务端没有断开。
短连接: 连接建立后,检测到通信交互完毕,就会关闭连接。下次需要通信时,需要再次建立连接。通信的过程为,建立连接 --> 数据传输 --> 关闭连接。比如银行业务通信,都是采用的短连接。
Tcp 的长连接和短连接: 长连接:在Tcp握手成功后,不立即断开连接,在此连接上进行数据传输,心跳交互,直至客户端或服务端中的任一方主动断开连接,此过程称为长连接。Http1.1 相对于Http1.0 最重要的特性就是引入了长连接。
短连接:客户端在收到服务端的响应后,立刻发送FIN 消息,主动释放连接。当然也有服务端主动断开连接的情况。
Tcp keepalive(保活机制) Tcp keepalive 通过定时发送 keepalive 探测包 来探测连接的对端是否存活。一旦发送的探测包没有响应,在重复几次后,就会断开连接。
http keep-alive(是否复用tcp连接)
在http 1.0 的时候,每个http请求都要打开一个tcp socket 连接,并且使用一次之后就关闭这个tcp连接。在http 1.1 之后,引入了keep-alive 请求头参数,可以通过这个参数控制在一次tcp 连接中可以持续发送多份数据而不会断开连接。这样就能复用tcp 连接,减少tcp连接建立的次数。
http 位于网络协议的应用层,tcp 位于网络协议的传输层。两者的keep-alive的作用是不一样的。http的keep-alive 主要是为了复用tcp连接,避免每次连接都建立tcp。tcp的keepalive主要是一种保活机制,检测对端是否依然存活。
WebSocket协议
其设计是用于提供低延迟、全双工和长期运行的连接。通信双方可以同时发送合接受数据,不需要等待对方的响应或传输完成。可以实现实时通信。
在WebSocket之前的实时通信的方式:轮询(客户端定期向服务器发送请求);长轮询(在客户端发出请求后,保持连接打开,等待新数据响应后在关闭连接);Comet(保持长连接,在发送请求后继续保持连接打开)。
优势
双向实时通信:允许在单个、长时间的连接上进行双向实时通信。在需要快速实时更新的应用程序里,比HTTP更加高效。 降低延迟:链接一旦建立变回保持开放,数据可以再客户端合服务器之间比HTTP更低的延迟进行传输。 更高效的资源利用:可以减少重复请求和响应的开销,因为其连接只需要建立一次。
心跳机制
为了保持WebSocket稳定的长连接,在连接建立之后,服务器和客户端会通过心跳包来包吃连接状态,以防止连接因为长时间没有数据传输而被切断。心跳包是一种特殊的数据包,通常是一个空数据帧,定期发送,避免长时间没有数据传输而中断。
限制
本身不提供加密功能,如果有安全上的需求,需要其他方式来确保安全性,如SSL协议。由于保持长连接需要服务器不断地维护和处理连接状态,需要优化性能。