关于Redis出现“java.io.IOException: 远程主机强迫关闭了一个现有的连接”的一次排查

article/2025/8/21 10:38:23

背景

最近在使用springboot(Windows下)连接redis(云服务器)开发时发现一些问题:连接成功的情况下,在一段时间未交互数据后,再次通过连接与Redis传输数据回出现异常java.io.IOException: 远程主机强迫关闭了一个现有的连接。
于是我上网找了一些博客主要是两种:

  • 可能是客户端连接太多了,开启timeout设置或tcp-keepalive
  • 将配置的的tcp-keepalive设置为60(可能之前是300)

这两个设置是什么意思呢

  • timeout,单位是秒,如果客户端连接空闲时间达到这个时间,就释放掉这个连接
  • tcp-keepalive,单位是秒,空闲时间达到这个时间就发送一个tcp-keepalive心跳包,用于检测客户端(在这里就是我的springboot程序)是否在线

探索

为了弄清楚原因,我开始对Linux用tcpdump抓包,在Windows下用wireshark抓包分析,发现一些问题

  • 我的设置是tcp-keepalive 300,在到达300s后,Linux的tcpdump抓到redis发送了心跳包,但是并未得到客户端回应,Windows的wireshark也没有抓到有收到redis的心跳包

  • 此后,redis每100秒重发一次心跳包,直到600秒发送rst,释放了tcp连接,而Windows还是无感知,连接状态是establish,因此,第10分钟(600秒)后,客户端用原来的连接与Linux的redis通信,不会得到ack回应,于是不断重发,直到超出阈值,springboot出现远程主机关闭连接的异常,然后重新进行三次握手重建连接

  • 并非要到10分钟连接才会失效,据我的测试,在240s后,Windows的springboot尝试通过连接与Linux的redis通信,但是发送不会得到ack,于是重发,直到超过阈值释放,重新三次握手。
    此时,springboot不会出现刚刚那个异常,但是是打印如下日志:
    在这里插入图片描述

    此时,Linux端还保留原来的连接,直到10分钟后(就像上面那样)。

  • 如果使用本地Windows的redis服务器,即使tcp-keepalive是300,redis在300s发送的心跳包就能被wireshark抓到,并且得到回应,保持连接,也就是表现正常。

由上面几点分析,可以认为两端的tcp通信受到阻碍。240s后,无论是Linux通过tcp连接给本地Windows发(tcp-keepalive),还是Windows给Linux发,都是无法得到回应。并且是Linux和本地的开发机之间才会出现,在一段时间不通信后,tcp连接就失效了。

推测原因

为了检验这个是底层tcp出现了问题,于是使用golang写了个小程序,连接后不发心跳包,等到250s后发送消息。
测试结果结果是:同样出现了发送数据未得到ack,重试几次后释放,tcpdump也没抓到对应数据。也就是我这边发的数据那边根本就没收到。
由于这个时间比较固定,在我的环境中,240秒后连接就失效了,我推测是某些地方设置了过期时间,再由同一个本地环境中的redis和springboot表现正常,我的推测是这可能是NAT(网络地址转换协议)的会话过期导致的
这个协议的作用是在本地多个设备使用同一个公网IP的情况下,通过一些配置路由到对应的子网设备。

解决

在我这里,只要把tcp-keepalive设置为240秒以下就好了

结束

推测的原因没有亲自去证实,希望有大佬能够证实或指出错误。


http://chatgpt.dhexx.cn/article/llD9qiWO.shtml

相关文章

远程主机强迫关闭了一个现有的连接.

报错信息: 解决方法: 1.在命令行中查找占用“5037”端口的程序PID netstat -aon|findstr “5037”2. 打开任务管理器,找到相应的PID【15692】,将占用的端口关闭。 3. 发现adb.exe与Android Studio.exe共用同一个端口 adb.exe——…

xdm,请求帮助

这个怎么搞,xdm

Ubuntu 安装 XDM 2018 ( Xtreme Download Manager 2018 )

Xtreme下载管理器是一个功能强大的工具,可以将下载速度提高到500%,保存来自YouTube,DailyMotion,Facebook,Vimeo,Google Video和1000多个其他网站的流媒体视频,恢复损坏/死亡下载&am…

Linux系统的下载神器XDM

自从装了双系统后一直在寻找一款媲美Windows系统中IDM的下载神器,XDM被我从云海中捞了出来!堪比IDM的下载速度,亦是一款神器。 使用说明书 下载地址:https://sourceforge.net/projects/xdman/解压后,使用终端进入该…

获取网页视频,日常下载工具推荐——XDM

Xtreme Download Manage 下载地址与浏览器关联工具的好处 下载地址 点击下载 与浏览器关联 需要谷歌,火狐或其他插件包,这里只提供谷歌插件,其他自行百度。 下载地址 下载后将后缀.crx改为.zip,进行解压缩,然…

谷歌浏览器扩展程序XDM_设计师的谷歌Chrome浏览器拓展程序推荐!Design Service Center...

01 Dualsub --Youtube 视频双语翻译字幕 在我们使用Youtube时时常会遇到我们想看的视频,但往往因为没有中文字幕而导致无法观看,现在Dualsub这款插件就能实现你的愿望了。他可以让Youtube同时显示两种语言字幕,可以是中英文,也可以…

GBase XDM Cluster 产品介绍

1.1. 产品特点 GBase XDM Cluster V8产品的主要特点有: 标准化: 数据库集群管理系统的访问遵循轻型目录访问协议LDAP v3,从而保持应用的标准性和独立性,提升了产品的易用性。便于与应用系统对接,同时也能够有效地降…

谷歌浏览器扩展程序XDM_如何下载和安装扩展程序?

今天分享一下怎么找拓展程序和安装拓展程序,这也是昨天答应了大家的。这个扩展程序真的是一个好东西,能够让你的浏览器变成高效、便捷、省钱的工具。 很多普通浏览器也有扩展程序商店,但是这个数量、功能等各方面还是不如谷歌浏览器强大,所以这里建议使用谷歌浏览器,以下文…

linux xdm 启动执行文件,Linux下配置XDM登录服务器

第一步,我们在Linux系统下,修改/etc/X11/xdm/Xaccess文件,找到下面的语句: # * #any host can get a login window 去掉最前面的#号,成为 * #any host can get a login window 第二步,我们修改/etc/X11/gdm…

XDM2020 Java版类似IDM微软下载器的开源下载工具编译

这款XDM是开源下载工具里面功能比较全,界面比较好看,虽说还比不上IDM,很多细节上的处理都不是很好,但是作为一个开源下载器来说,已经很不错的了,接下来,我将会好好优化一番,以期能替代电脑中的IDM吧,比较迅雷越来越不友好了,IDM也没找着个长久能用的,用着用着就催你…

Linux下载神器XDM,代替IDM

Windows上IDM多线程下载非常强大,即能捕捉页面上的视频、图片、音频,又能作为浏览器下载器使用,但是IDM无法在Linux下使用,除非使用wine。不过我们可以在Linux中用XDM代替IDM。 XDM(Xtreme Download Manager) 下载安装 XDM下载…

Linux下载神器XDM

Window上IDMTampermonkey下载速度非常快,Linux系统上可以用XDM替代。 1.安装 (1)下载 Xtreme Download Manager下载 (2)解压,在./install.sh目录下打开终端,输入命令: sudo ./i…

Ubuntu 16.04 LTS安装XDM下载神器

XDM(XStream Download Manager)是一款下载神器,可以快速通过链接下载任何可以下载但网速受限的文件(压缩包、文档、软件,等等),使用方便,操作简单。图1是使用XDM与浏览器下载同一个文…

全球最快下载工具 XDM

一、工具介绍 XDM(Xtreme Download Manager),下载管理器是一款超级强大的下载工具,可以将下载速度提高到 500%、可以自动检测来自浏览器的流媒体视频地址,并进行高速下载、也可恢复损坏/死的下载、安排和转换下载。XDM…

V8引擎-js执行原理

​ 前言: 今天小编给大家讲解一下小伙伴们心中一直存在的问题,那就是我们在使用node环境或者浏览器的时候为什么可以执行js代码? 我们定义了很多的变量和函数内部是如何处理的? 以及我们常常说的作用域以及变量提升到底是什么? 接下来小编将逐一的带大家去解决这些问题? 再…

V8引擎执行JS(函数)过程(详解)

V8引擎执行JS(函数)过程 JS代码执行阶段代码执行过程 JS代码执行阶段 Parse阶段:Parse模块会将JavaScript代码转换成AST(抽象语法树),这是因为解释器并不直接认识JavaScript代码 Lgnition阶段:…

【JS】V8 引擎原理

文章目录 认识JS引擎V8引擎原理V8引擎架构V8引擎的解析图 认识JS引擎 为什么需要 JS 引擎? 1. 高级编程语言都有转化成最终的机械指令来执行的 2. 我们平时编写的js,无论你交给浏览器或Node执行,最后都是需要被CPU执行的 3. 但CPU只认识自己…

浏览器执行原理-V8引擎

浏览器内核 不同浏览器的内核组成 Gecko:早起被Netscape和Mozilla Firefox浏览器使用 Trident:微软开发,被IE4-IE11浏览器器使用,但在Edge已经转向Blink Webkit:苹果基于KHTML开发、开源的,用于Safari,Google Chrome之前也在使用 Blink:是…

浏览器原理之V8引擎

主流 JS 引擎 JavaScript 的主流引擎如下所示: V8 (Google) SpiderMonkey (Mozilla) JavaScriptCore (Apple) Chakra (Microsoft) duktape(IOT)JerryScript(IOT)QuickJSHermes(Facebook-React Native) V8 之 what & why & when? waht:V8是一…

V8引擎工作原理

V8引擎工作原理 1.V8引擎是干什么的? V8的工作是将js代码翻译为CPU指令。 2.V8工作过程 Blink将js源码交给V8引擎 Stream对js源码编码 Scanner进行词法分析,将代码转为token token转化为AST树 Parser将tokens直接转化为AST树PreParser(…