问题标签 [tcp-keepalive]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1412 浏览

java - 如何找出特定端点是否在 Spring Boot 中启用了 keepalive?

我有一个 Spring Boot 应用程序,其中声明了几个端点,如下所示:

如何确定该控制器使用的套接字是否打开了TCP keepalive ?

更新 1:我使用libdontdie启动了应用程序,即sudo DD_DEBUG=1 DD_TCP_KEEPALIVE_TIME=4 DD_TCP_KEEPALIVE_INTVL=5 DD_TCP_KEEPALIVE_PROBES=6 LD_PRELOAD=/usr/lib/libdontdie.so java -jar myapp.jar --spring.config.location=myapp-config.yaml &. 需要等到明天看看它是否有效。

0 投票
1 回答
487 浏览

c# - Postgres c# 监听超时

我正在使用 Postgres 9.5,它有一个称为LISTEN/NOTIFY允许您设置异步命令通道以从服务器获取通知的功能。在我的应用程序运行并测试通知的前 10-15 分钟内,一切似乎都正常,但经过一定时间后,消息似乎被丢弃了。

有人对什么可以防止这种行为有任何建议吗?这与保持活动/ tcp 保持活动设置有关吗?在 pg_state_activity 我看到相同的连接并且它处于空闲状态。

总体情况概述

  • 在 c# 中使用 npgsql 库到异地 Postgresql 服务器
  • 使用长时间运行的连接(设置监听、等待)
  • 执行查询以侦听传入的通知和通知
  • 等待(使用取消令牌)直到收到消息(连接时没有其他活动发生)。

查看 StackOverflow 上的其他一些答案,似乎人们也将其归因于池化,尽管我不完全确定这是否能很好地转化为,npgsql因为它在连接/断开连接时汇集连接。

我将不胜感激人们对这个问题的任何见解,有人知道如何使我的情况发挥作用吗?这是罪魁祸首的代码片段:https ://gist.github.com/phr34k/3a59af154d8ce6636dfc332271052a6a

编辑

针对jjanes的回复,我去进一步调查。当我查看它时,pg_state_activity它列出了处于空闲状态的连接。当我在服务器上交叉引用客户端端口号netstat -t时,至少我没有看到列出的连接。

公平地说,在我跑步之前我netstat -t确实尝试过,pg_notify所以我还不能确定跑步是否pg_notify不会导致它终止。然而,奇怪的是连接一直显示在pg_state_activity好像 postgres 甚至没有意识到连接已关闭?

我认为这与防火墙和空闲连接有关。有人知道 ubuntu/数字海洋堆栈中是否有任何默认值会在一段时间后终止连接?

0 投票
0 回答
208 浏览

lwip - lwIP TCP keepalive 数据包在电缆断开期间不服从设置

我有一个基于 Xilinx Zynq 的开发板,上面运行着 FreeRTOS。它的 EMAC 连接到铜/光纤(非托管)交换机(安装在板上)。我在套接字模式下使用 lwIP 2.02。

板上运行的应用程序用作 TCP 客户端。为了监控连接,我使用了 lwIP 的 TCP keep-alive 特性。我配置了 3 次重试,间隔为 2 秒。当连接启动并运行并且没有流量时,我在日志中看到保持活动数据包(几乎)每 2 秒发送一次。但是,当我断开光纤电缆时(回想一下,它在交换机的另一端,并没有直接连接到 EMAC),每 10 秒发送一次保持活动数据包,因此我能够接收到仅在大约 30 秒后通知有关我的应用程序代码中的断开连接。作为替代方案,我尝试查询 EMAC 的链接状态,但它总是报告(这是有道理的,因为它总是连接到交换机)。有没有人遇到过这样的问题?

非常感谢,亚历克斯

0 投票
2 回答
1048 浏览

python - 健壮的连续 TCP 连接(python 套接字)

我的目标是在一台服务器和一个客户端之间建立一个连续且健壮的 TCP连接。如果一侧出现故障,另一侧应该等到它恢复。

我基于这个问题(只要求连续但不健壮的 TCP 连接并且不处理保活问题)、这篇文章和我自己的经验编写了以下代码。

我有两个问题:

  1. 我怎样才能使keepalive工作?如果服务器死了,客户端只有在尝试之后才能识别它send()- 这也可以在没有KEEPALIVE选项的情况下工作,因为这会导致连接重置。是否有某种方法可以让套接字为已死的连接或我可以定期检查的某些保活功能发送中断?

  2. 这是处理连续 TCP 连接的可靠方法吗?拥有稳定、连续的 TCP 连接似乎是一个标准问题,但是,我找不到详细介绍此问题的教程。必须有一些最佳实践

请注意,我可以在应用程序级别自行处理保持活动消息。但是,由于 TCP 已经在传输层实现了这一点,因此最好依赖较低层提供的这种服务。

服务器:

客户端:

我试图尽可能少地保留这个例子。但考虑到鲁棒性的要求,它相对较长。

我还尝试了一些套接字选项,如TCP_KEEPIDLE,TCP_KEEPINTVLTCP_KEEPCNT.

谢谢!

0 投票
0 回答
16 浏览

sockets - 保持活动套接字选项和“连接:保持活动”标题

我的套接字(套接字,我在 accept() 之后获得)的选项如何与 HTTP 标头“连接:保持活动”相关?我知道,如果我想让我的套接字保持活动状态,我需要设置以下选项:SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL 和 TCP_KEEPCNT。例如,如果我想等待 10 秒,然后以 2 秒的间隔发送最多 10 个探测,在断开连接之前,我会写这样的内容:

如果我打算保持连接打开最多五个事务,或者直到它空闲两分钟,我将在我的响应中发送下一个标头:

一切都好,但我不明白这些事情是如何相互关联的。我应该如何向我的 HTTP 服务器添加对 Keep-Alive 属性的支持?

我将不胜感激任何帮助。先感谢您。

0 投票
1 回答
79 浏览

sockets - 更改 IP 地址后 TCP 套接字状态保持不变,即使提前配置了 keep-alive

我遇到了一个关于 TCP socket keepalive 的问题。

TCP keep-alive 在 socket 连接后启用和配置,系统有自己的 TCP keep-alive 配置。

'ss -to' 可以显示连接的存活信息。

网络接口是一个 PPPOE 设备,如果我们 ifup 接口,它将获得一个新的 ip 地址。并且旧的 TCP 连接将保持建立,直到 keep-alive 超时。

但有时 'ss -to' 表明 tcp 连接变为 'persist',需要很长时间(大约 15 分钟)才能关闭。

以下是“ss -to”的结果:

源地址为“172.0.0.60”,但网络接口的实际地址已更新为“172.0.0.62”。

这是 'ss -to' 的正确结果:

我不知道为什么“计时器”被更改为“持久”,这使得保持活动被禁用。

0 投票
2 回答
564 浏览

linux - 在启用 TCP 保持活动选项时获取无效参数作为失败原因?

我试图实现 TCP 客户端以发送 TCP 保持活动请求,但所有选项都因参数无效而失败。我的代码如下所示:

我不明白为什么它为所有setsockopt API 提供无效参数。使用 setsockopt 设置保持活动选项有什么问题吗?

0 投票
0 回答
84 浏览

tcp - TCP KEEP ALIVE Ack 在一段时间内没有看到

我有一个在 linux 上运行的 TCP 应用程序。我为我的 TCP 连接设置了 SO_KEEPALIVE 选项。这是我的设置。

如果系统(B)没有收到 3 个探测计数的 ack,那么我的系统(A)将从其他系统(B)获得 tcp keep alive ,它将重置连接。问题:有时我观察到的是 tcp keep alive ack 未发送(有时),由于此连接正在重置。有人可以告诉我不发送此 tcp keep alive ack 的可能原因是什么?

0 投票
1 回答
98 浏览

tcp - 发送keepalive数据包后TCP是否会终止死空闲连接

我对 TCP keepalive 的理解:

这个keepalive并没有真正“保持连接活跃”。相反,“detectAlive”可能是一个更恰当的词:Tcp 级别交换心跳包以检测空闲连接是死的还是活的。

以下是我的问题:

  1. TCP知道连接死掉后,TCP层会自动关闭连接吗?
  2. TCP知道连接死了之后,应用层怎么知道这个信息呢?通过知道该信息,它会关闭套接字并释放资源
0 投票
1 回答
333 浏览

python-requests - python - 如何在多进程池中回收来自单个requests.Session对象的请求的连接?

以下是针对该问题简化的完整代码。

ids_to_check返回一个 id 列表。对于我的测试,我使用了 13 个随机字符串的列表。

输出:

我的观察:

  • 创建了多个连接(即每个进程的连接),但会话对象在整个代码执行过程中是相同的(因为会话对象 ID 相同)
  • 从 ss 输出看,连接保持循环。我无法确定回收的任何特定模式/超时
  • 如果我将进程减少到较小的数量,则连接不会被回收。(例:5)

我不明白连接是如何/为什么被回收的,以及如果我减少进程数为什么它们不是。我已经尝试禁用垃圾收集器import gc; gc.disable()并且仍然回收连接。

我希望创建的连接保持活动状态,直到达到最大请求数。我认为它可以在没有会话并使用 keep-alive 连接标头的情况下工作。

但是我很想知道是什么导致这些会话连接在进程池长度很高时保持回收。

我可以在任何服务器上重现此问题,因此它可能不依赖于服务器。