websocket断线重连问题

websocket功能背景

websocket为web应用的客户端和服务端提供了一种全双工的通信机制,底层依赖TCP连接,为保证高可用和及时性,不得不设计一套保活、验活、重连的方案。 本文从实践过程中对重连存在的疑问进行分析。

测试项目

服务端 springboot+websocket

github.com/liuyanqun08…

客户端测试

www.websocket-test.com/

通过api接口模拟服务端断开连接

http://localhost:8081/close?userId=liuyanqun

异常场景总结

场景1(断网恢复接收消息)

  1. websocket客户端(web页面)断网
  2. websocket服务端发送消息给客户端
  3. 客户端断网等待一段时间(测试等待1个小时)在恢复网络
  4. 客户端还可以监听到了服务端的消息

分析原因

websocket断开通常依赖于超时机制或者明确的关闭指令

web页面断网后,无法主动通知TCP断开连接,所以需要心跳验活机制保证双端正常通信。

websocket底层基于TCP,TCP协议支持保持连接(Keepalive)所以一定时间内断网恢复网络后还能收到服务推送的消息。TCP本身有超时机制时长影响因素比较多(网络断开的时间长度、TCP 超时设置以及具体的 WebSocket 实现方式)。我测试所有都是默认设置,测试断网1个小时恢复网络,依然可以收到服务端之前推送的消息。网上有说默认TCP超时2个小时,后面找个时间在验证下。

场景2(断网断开socket连接)

  1. websocket客户端(web页面)断网
  2. websocket服务端发送消息给客户端,服务端管理socket连接
  3. 客户端断网等待一段时间(测试等待10分钟)在恢复网络
  4. 客户端还可以监听到了服务端的消息,和断开socket消息

分析原因

websocket客户端断网期间,服务端通过channel发送消息,以及断开连接发送的关闭帧,实际上都是消息。这些消息存储在操作系统的TCP和IP栈。

对于 WebSocket 来说:

  • 当服务端通过 WebSocket 发送消息给客户端时,这个消息实际上是通过底层的 TCP 连接发送的。因此,如果客户端由于断网或其他原因没有发送确认应答,服务端的 TCP 栈会根据超时设置重传消息。
  • 客户端的 TCP 栈也会缓存它收到的 TCP 消息,直到应用程序层(在这种情况下是 WebSocket 客户端)读取这些数据。如果客户端应用程序由于某种原因(如崩溃或断网)没有读取这些数据,TCP 栈仍然会保持这些数据直到它们被读取或者连接被关闭。
  • 如果客户端断网,它将无法发送确认应答给服务端,服务端的 TCP 栈会根据其超时设置尝试重传消息。但是,如果客户端长时间无法恢复网络连接,服务端最终可能会因为超时过多而关闭连接。

总结来说,操作系统的 TCP/IP 栈确实会缓存未发送确认的消息,并在必要时进行重传,这是 TCP 协议保证数据传输可靠性的一部分。然而,WebSocket 应用层需要正确处理这些情况,以确保应用层的逻辑能够适应底层 TCP 协议的行为。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket断线重连问题是由于网络不稳定或者服务器端出现问题导致客户端和服务器之间的持久连接中断时遇到的问题。以下是处理这些问题的一些常见策略: 1. **心跳机制**:客户端和服务端定期发送小数据包(心跳包),检测对方是否在线。如果长时间未收到回应,则尝试重新连接。 2. **重试连接**:当连接失败时,设置合理的重试间隔时间(如5秒到60秒逐渐递增),然后尝试重新发起连接。 3. **异常处理**:在接收到错误码或特定异常时,判断是否是暂时性的网络问题,而不是服务器宕机,如果是则等待一段时间再恢复连接。 4. **断线通知**:在重新连接前,给用户提示网络已断或连接正在尝试恢复,提高用户体验。 5. **自动重连**:在某些场景下,例如游戏或聊天应用,可能希望有自动重连功能,即使用户离开一段时间后,系统依然能自动尝试重新连接。 6. **服务器状态检查**:服务端也需要监控自身的状态,比如内存占用、负载均衡等,防止因为服务器内部故障导致无法正常接收连接。 7. **错误重试机制**:对于服务器返回的错误,可以采用有限次数的重试或者基于错误类型的重试策略。 处理WebSocket断线重连的关键在于设计良好的错误处理机制和合适的重试策略,以及对服务器端状态的有效监控,确保在网络不稳定的情况下,仍然能够维持应用程序的可用性和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值