目录
如何保证 WebSocket 连接的稳定性(心跳检测与断线重连)
一、短轮询、长轮询、SSE、WebSocket的区别
区别
- 短轮询 (Short Polling):客户端每隔固定时间向服务器发起请求。缺点是大量无效请求造成服务器压力和带宽浪费,实时性差(取决于轮询间隔)。
- 长轮询 (Long Polling):客户端发起请求后,服务器挂起连接直到有数据才返回。虽然减少了空请求,但本质仍是“请求-响应”模式,连接频繁重建,且难以实现真正的双向通信。
- SSE (Server-Sent Events):基于 Tcp+Http 的单工通信技术。它通过在客户端和服务器之间建立一个长连接,使得服务器能够主动向客户端发送数据,而不需要客户端明确地请求,这种机制相比传统的短轮询和长轮询技术更高效和实时。
- 节省资源:只需要建立一条长连接,不需要频繁地建立和关闭连接,从而节省服务器和客户端的资源。
- 可靠性高:使用HTTP协议进行通信,具有较好的兼容性和稳定性,原生支持自动重连。
- 简单易用:只需要使用浏览器内置的EventSource对象即可实现数据的实时推送。
- 仅支持服务器到客户端的单向通信,是一种轻量级的通信机制。
- 通常只支持文本格式,若只需服务器向客户端单向推送少量文本通知(如新闻更新、日志监控),SSE是更合适的选择。
- SSE主要为Web应用设计,不适用于移动应用或传统桌面应用。因为其本质上是为浏览器环境设计的单向实时通信技术,其核心依赖于浏览器内置的
EventSourceAPI。- EventSource 是HTML5标准定义的一个 Web API 接口,主要用于实现 服务器发送事件(Server-Sent Events, SSE)。它允许网页自动获取来自服务器的更新,建立一种从服务器到客户端的单向、持久、实时的数据推送通道。
- 数据格式: 服务器发送的数据必须是纯文本格式,且 MIME 类型必须设置为
text/event-stream:response.setHeader("Content-Type", "text/event-stream"); - EventSource实现服务端与客户端通信案例实战-CSDN博客
- WebSocket:基于 Tcp+WebSocket 的全双工通信协议。能够实现客户端和服务器之间的双向实时持久通信,具备低延迟和高通信效率的特性,支持二进制数据,且在各种浏览器中都有良好的兼容性,广泛应用于Web开发领域。缺点是需自行处理心跳、重连等机制,实现复杂度高于SSE,资源消耗也更大。以下是一些常见的使用场景:
-
即时通讯:如在线聊天、即时游戏、共享文档等。
-
实时数据流:如金融交易、体育结果更新、环境监控、多媒体在线音视频流服务、推送券到app、服务器到浏览器的消息推送等。
-
补充
-
单工只能单向传输数据,发送方只能发,接收方只能收,角色固定不变。比如电视广播、遥控器、传感器上报数据,听众或接收端无法反向发送信息。
-
半双工允许双向传输但不能同时,同一时刻只能一个方向,需要切换方向。对讲机是典型例子——按住说话时对方只能听,松开后角色互换。
-
全双工最顺畅,支持双向同时传输,双方可独立收发,就像电话通话,两边能同时讲话和听对方声音。现代网络通信、视频会议多采用这种方式。
- TCP协议通过三次握手建立连接,在连接建立后就可以保持长时间的连接,TCP也是长连接。
- HTTP默认使用短连接,每次请求都会建立一个新的连接,请求完成后连接就会关闭,这意味着每次请求都需要重新建立连接,这会导致额外的延迟和资源消耗。
- FTP协议使用的是长连接(即在用户会话期间一直保持控制连接和数据连接),FTP工作在OSI模型的应用层,使用TCP作为其传输协议,确保数据传输的可靠性和顺序性。由于FTP传输效率非常高,在网络上传输大的文件时,一般采用该协议。FTP客户端通过FTP协议访问位于FTP服务器上的资源。
二、WebSocket
握手过程及协议升级机制
WebSocket 是如何从 HTTP 协议升级为 WebSocket 协议的?
握手过程中关键头部字段有哪些?作用是什么?
- 客户端发起请求:客户端发送一个标准的 HTTP GET 请求,但包含特定的升级头字段:
Upgrade: websocket:指示服务器希望切换协议。Connection: Upgrade:确认连接升级。Sec-WebSocket-Key:一个随机生成的 Base64 编码字符串,用于防止非 WebSocket 客户端误连,确保协议升级的合法性。Sec-WebSocket-Version:指定 WebSocket 协议版本(通常为13版本)。
- 服务器响应:服务器校验请求头,若支持 WebSocket,则返回状态码
101 Switching Protocols,并在响应头中包含:Upgrade: websocketConnection: UpgradeSec-WebSocket-Accept:将客户端传来的Sec-WebSocket-Key加上特定 GUID 字符串后进行 SHA-1 哈希运算,再 Base64 编码生成。客户端会校验此值以确认服务器身份。
- 协议切换:握手成功后,HTTP连接断开,底层TCP连接保持,双方切换到WebSocket协议进行全双工通信。
如何保证 WebSocket 连接的稳定性(心跳检测与断线重连)
在网络波动或中间件拦截下,如何检测连接是否存活?断开后如何优雅重连?
由于 WebSocket 基于 TCP,若网络异常断开(如拔掉网线、路由器重启),TCP 层可能不会立即通知应用层,导致“僵尸连接”。因此需要应用层的心跳机制。
-
心跳检测 (Heartbeat):
- 机制:利用 WebSocket 协议自带的控制帧
Ping和Pong。客户端或服务器定期发送Ping帧,对方收到后必须回复Pong帧。 - 超时判定:若发送
Ping后在一定时间内未收到Pong,或长时间未收到任何数据帧,则判定连接断开,主动关闭连接并触发重连逻辑。 - 自定义心跳:也可通过业务层发送特定消息(如
{type: 'ping'})来实现自定义心跳,但使用协议级 Ping/Pong 效率更高且不占用网络带宽。
- 机制:利用 WebSocket 协议自带的控制帧
-
断线重连策略:
- 指数退避 (Exponential Backoff):避免频繁重连冲击服务器。例如,首次重连等待 1s,失败后等待 2s、4s、8s... 直到达到最大间隔时间。
- 消息补偿:对于重要通知,可在重连成功后,通过序列号或时间戳向服务器请求缺失的消息,确保通知不丢失(需结合业务层的 ACK 机制)。
WebSocket案例
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@EnableWebSocketMessageBroker
//是Spring Framework中的一个注解,使应用程序支持WebSocket通信
三、Tcp和Udp
Tcp3次握手4次挥手
TCP(Transmission Control Protocol)传输控制协议,是互联网协议套件中最核心的协议之一,提供可靠的、面向连接的、基于字节流的传输层通信。
TCP FLAG 位由 bit 组成,分别代表 SYN、ACK 、 FIN、 URG、 PSH 、RST ,都以置1表示有效。我们重点关注 SYN、 ACK、 FIN。 SYN ( Synchronize Sequence Numbers )是用作建立连接时的同步信号;ACK ( Acknowledgement )用于对收到的数据进行确认,所确认的数据由确认序列号表示;FIN ( Finish )表示所建立的连接可以关闭了,后面没有数据需要发送。
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?_帅地的博客-CSDN博客

tcp和udp的区别


五、OSI参考模型
OSI(Open Systems Interconnection Reference Model)七层参考模型 是国际标准化组织(ISO)制定的网络通信概念模型,用于描述数据如何在网络中从源头传送到目的地。
注意:OSI是参考模型,现实中互联网主要是基于TCP/IP的四层/五层模型。
| OSI层级 | 名称 | TCP/IP 5层模型 | 功能概述 | 典型协议 / 技术 |
|---|---|---|---|---|
| 7 | 应用层 | 应用层 | 为用户应用程序提供网络服务接口 | HTTP、HTTPS、FTP、SMTP(发邮件)、IMAP(收邮件)、POP3(收邮件)、DNS、Telnet、SSH |
| 6 | 表示层 | 数据格式转换、加密/解密、压缩/解压 | JPEG(图片文件格式)、MPEG(视频文件格式)、ASCII、UTF-8、SSL/TLS(部分归于此) SSL/TLS功能上常被归入应用层或传输层之上,因为它为HTTP等应用层协议提供加密服务。 | |
| 5 | 会话层 | 建立、管理和终止会话/连接 | NetBIOS、RPC(部分)、SQL Session | |
| 4 | 传输层 | 传输层 | 端到端通信、可靠/不可靠传输、流量控制 | TCP(可靠)、UDP(无连接) |
| 3 | 网络层 | 网络层 | 逻辑寻址和路由选择 | IP(IPv4/IPv6)、ICMP、ARP(常关联)、OSPF、BGP、RIP |
| 2 | 数据链路层 | 数据链路层 | 物理寻址(MAC)、帧校验、差错控制 | Ethernet(802.3)、Wi-Fi(802.11)、PPP、MAC、交换机 Ethernet(以太网)和因特网(Internet)是完全不同的概念。
|
| 1 | 物理层 | 物理层 | 比特流在物理介质上传输 | 双绞线、光纤、同轴电缆、集线器(Hub)、电压、光信号 |
598

被折叠的 条评论
为什么被折叠?



