Websocket-实时通信
前言
之前一直听说Websocket,但也一直没有使用过,今天突然又看到了,还挺感兴趣的,可以一起看看
一、目前可实现实时通信的方式
1、轮询(polling)
原理:浏览器间隔几秒发送一次请求,询问服务器是否有新消息出现,持续
优点:实现简单,大部分浏览器和服务器支持
缺点:频繁的请求和响应会导致不必要的网络开销,降低性能和效率
场景:数据更新频率不高且实时性要求不高的场景
2、长轮询(long polling)
原理:和 ajax 轮询差不多,采取阻塞模式,客户端发起请求,没有没有消息,服务器则不返回,客户端收到响应,立即再次发出请求,形成新的挂起请求,持续
优点:相较于轮询,减少了不必要的网络请求,降低网络开销
缺点:服务器需要维护大量挂起请求,占用资源较多,不适用于高并发场景
场景:数据更新不频繁,但要求实时性相对较高的场景
ajax 和长轮询都是在不断的建立 HTTP 连接,然后等服务端处理(HTTP 特点:被动性)
3、Websocket
原理:WebSocket 是一种全双工通信协议,通过建立持久性的连接,客户端和服务器可以随时发送和接收消息。连接建立后,双方可以直接发送消息,不需要频繁的握手过程
优点:实现实时通信,降低了不必要的网络开销,性能较高,支持跨域通信
缺点:需要服务器和客户端都支持 WebSocket 协议
场景:适用于需要实时通信,如实时聊天,在线游戏,实时数据展示,多人协同编辑
websocket 只需要一次 HTTP 握手,整个过程是建立在一次连接/状态中(避免 HTTP 非状态性)
通过 Websocket 可以构建实时、高效和响应迅速的 web 应用程序
3.1、WebSocket 心跳机制
- 确保活跃连接:WebSocket是一种双向通信协议,一旦建立连接,服务器和客户端之间可以实时传输数据。但由于网络等原因,长时间没有数据传输可能导致连接的关闭。心跳机制通过定期发送心跳包,即使没有实际数据交互,也能保持连接的活跃状态,防止连接被中断。
- 确认服务器存活状态:通过心跳机制,客户端可以定期向服务器发送心跳包,并等待服务器的响应。如果一段时间内没有收到服务器的响应,客户端可以判断服务器可能出现了故障或断开连接,并根据情况进行相应的处理,如重新连接服务器。
- 优化网络资源利用:心跳机制可以定时发送较小的数据包,相较于大量数据传输,心跳包的资源占用较小。这有助于减少网络资源的浪费,并提高数据传输效率。
- 错误处理与重连:通过心跳机制,客户端可以及时检测到连接断开的情况,并进行错误处理和重连操作。在网络环境不稳定或服务器故障的情况下,心跳机制可以帮助客户端更快地恢复与服务器的连接。
- 连接状态监控:心跳机制可以用于监控 WebSocket 连接的状态,包括连接建立、断开、异常等状态。这有助于客户端了解连接状态,做出相应的操作。
3.2、WebSocket 工作原理
WebSocket 的工作原理可以分为三个阶段:握手、数据传输和断开连接
握手:客户端发起 WebSocket 连接时,通过向服务器发送一个特殊的 HTTP 请求头来建立连接。服务器检查请求头中的特定字段,确认支持 WebSocket 协议后,发送特殊的 HTTP 响应头进行握手确认。握手成功后,双方建立了 WebSocket 连接,可以进行后续的数据传输。
数据传输:一旦建立了 WebSocket 连接,客户端和服务器可以通过该连接进行双向的实时数据传输。双方可以发送和接收消息,消息以帧的形式进行传输。WebSocket 协议定义了不同类型的帧,如文本帧和二进制帧,用于传输不同类型的数据。
断开连接:当连接不再需要时,客户端或服务器可以发起关闭连接的请求。双方会交换特殊的关闭帧,以协商关闭连接,并确保双方都接收到了关闭请求。
3.3、Websocket 优点
- 实时性:与传统的 HTTP 请求/响应模式不同,WebSocket 允许实时双向通信,使得服务器能够主动向客户端推送数据,而不需要客户端发起请求。
- 服务器压力减少:WebSocket 连接保持打开状态,因此服务器不需要为每个请求创建一个新的连接。这可以减轻服务器的负载并提高性能。
- 与 HTTP 协议良好的兼容性,默认端口也是 80 和 443,握手阶段采用 HTTP 协议
- 可以发送文本,也可以发送二进制数据。
- 没有同源限制,客户端可以与任意服务器通信。
- 协议标识符是 ws(握手 http),如果加密则为 wss(tcp+TLS),服务器网址是 URL。
- 只需要经过一次 HTTP 请求,就可以一直传送消息(也称为回调)。
3.4、HTTP 和 Websocket 关系
Websocket 是一种新的协议,跟 HTTP 协议基本没关系,为了兼容浏览器的握手规范,也可以说是 HTTP 协议上的一种补充。
二、HTTP 协议-TCP 三次握手、四次挥手
1、TCP 和 TCP 连接
TCP:TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
TCP 连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
2、HTTP 和 TCP 关系
HTTP(Hypertext Transfer Protocol) 是一种应用层协议,主要负责数据的传输和格式化。它的主要功能是规范浏览器与服务器之间的通信格式,确保数据按照预定的规则传输。
TCP(Transmission Control Protocol) 则是一种传输层协议,负责数据如何在网络中传输。它定义了数据传输的方式,包括连接的建立、维持以及数据包的发送和接收。TCP 确保数据传输的可靠性,即数据是否能够按预期到达目的地。
HTTP 依赖于 TCP 来进行数据传输,HTTP 用于处理请求和响应的格式,而 TCP 则负责建立连接、保持连接以及数据包的可靠传输。也可以说 HTTP 运行在 TCP 之上。
3、关于 TCP 连接的常用术语
- SYN:synchronous 建立联机
- ACK:acknowledgement 确认
- PSH:push 传送
- FIN:finish 结束
- RST:reset 重置
- URG:urgent 紧急
- Sequence number:顺序号码
- Acknowledge number:确认号码
4、三次握手
4.1、什么是三次握手
所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包。
4.2、为何需要三次握手
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
4.3、过程
第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 位置为 1,Sequence Number 为 x;然后,客户端进入 SYN_SEND 状态,等待服务器的确认;
第二次握手: 服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,设置 Acknowledgment Number 为 x+1(Sequence Number+1);同时,自己自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 报文段。然后将 Acknowledgment Number 设置为 y+1,向服务器发送 ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手。
5、四次挥手
5.1、什么是四次挥手
所谓四次挥手(Four-way Handshake),是指终止一个 TCP 连接,需要总共发送 4 个包来完成这个过程。
5.2、为何需要四次挥手
当数据传输完成,tcp 通过四次挥手断开 tcp 连接,释放系统资源
5.3、过程
第一次挥手:主机 1(可以使客户端,也可以是服务器端),设置 Sequence Number,向主机 2 发送一个 FIN 报文段;此时,主机 1 进入 FIN_WAIT_1 状态;这表示主机 1 没有数据要发送给主机 2 了;
第二次挥手:主机 2 收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段,Acknowledgment Number 为 Sequence Number 加 1;主机 1 进入 FIN_WAIT_2 状态;主机 2 告诉主机 1,我“同意”你的关闭请求;
第三次挥手:主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入 LAST_ACK 状态;
第四次挥手:主机 1 收到主机 2 发送的 FIN 报文段,向主机 2 发送 ACK 报文段,然后主机 1 进入 TIME_WAIT 状态;主机 2 收到主机 1 的 ACK 报文段以后,就关闭连接;此时,主机 1 等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机 1 也可以关闭连接了。
文章来源:https://www.toymoban.com/news/detail-828329.html
文章来源地址https://www.toymoban.com/news/detail-828329.html
到了这里,关于Websocket及三次握手/四次挥手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!