问题标签 [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 投票
1 回答
4286 浏览

elasticsearch - 在 Elasticsearch 服务器中配置保持活动超时

我想知道 Elasticsearch 是否提供了一种配置keep-alive超时的方法。

我可以看到此页面描述了network.tcp.keep_alive可用于启用 TCP Keep Alive 的 TCP 设置。我正在 Elasticsearch 中寻找一种配置实际超时值的方法。

我正在使用 Elasticsearch 5.6.8。

0 投票
4 回答
10366 浏览

java - 如何从 HttpClient 设置 TCP 保持活动状态?

我位于 AWS 私有子网中的 Java 应用程序通过 AWS Nat 网关连接到 http 服务器。我正在通过HttpClientHTTP 服务器调用 POST 请求。该请求将需要 10 多分钟才能完成。我已经配置了 1 小时的套接字超时和连接超时,因为这是一个后台任务。但是中间 AWS NAT 网关将在 300 秒 [5 分钟] 后发回 RST 数据包并导致连接重置,我无法增加 NAT 网关超时。所以我需要从我的应用程序端处理问题。

我的策略是使用 TCP 保持活动时间,它将每 240 秒发送一个数据包以保持连接处于活动状态。我已将其配置如下

然后通过execute方法调用post请求

由于我使用的是 Linux 系统,因此我使用以下 sysctl 值配置了服务器:

但是在执行程序时,没有启用保持活动,并且连接像以前一样失败。

我已经用 netstat -o 选项检查了这个,如下所示保持活动关闭

有什么方法可以使用 httpclient 从 java 代码中设置 TCP 保持活动状态。我也可以看到HttpConnectionParams已弃用。但是我找不到任何可以设置保持活力的新课程

0 投票
2 回答
2377 浏览

java - Java REST 的正确心跳/保持活动技术/层是什么?网址?tcp? 编码:分块?

设置:

我们有一个https://Main.externaldomain/xmlservlet站点,例如,它正在验证/验证/地理定位和代理(稍作修改)对http://London04.internaldomain/xmlservlet的请求。

根本无法直接访问暴露给最终用户的内部域。站点之间的通信偶尔会中断,有时内部域节点变得不可用/死机。

主站点使用 org.apache.http.impl.client.DefaultHttpClient(我知道它已被弃用,我们正在逐步升级此遗留代码),并将 readTimeout 设置为 10.000 毫秒。请求和响应具有可变长度的 xml 有效负载/正文,并且Transfer-Encoding: chunked使用了,也Keep-Alive: timeout=15使用了。

问题:

有时 London04 实际上需要超过 10 秒(比如说 2 分钟)来执行。有时它会不优雅地崩溃。有时会发生其他(网络)问题。有时在这 2 分钟内 - response-xml-data 的部分被逐渐填充,部分之间没有 10 秒的间隙,因此 readTimeout 永远不会超过,有时会有 10+ 秒的间隙并且 HttpClient 超时...

我们可以尝试增加 Main 端的超时,但这很容易使侦听器池膨胀/过载(仅通过常规流量,甚至还没有被 DDOS)。我们需要一种方法来区分 internal-site-still-working-on-generating-the-response 和它真正崩溃/network_lost/等的情况。最好的感觉是交流过程中的某种心跳(每 5 秒)。

我们认为 Keep-Alive 会拯救我们,但它似乎只保护请求之间的间隙(而不是请求期间),并且在间隙期间似乎没有做任何心跳(只是有/waiting_for 超时)。

我们认为分块编码可以通过发送一些心跳(0-bytes-sized-chunks)让对方知道来拯救我们,但似乎没有这样/默认的实现以这种方式支持任何心跳,而且似乎 0-字节大小的块本身就是一个 EOD 指标......

问题):

如果我们正确假设 KeepAlive/ChunkedEncoding 不会帮助我们实现 keepAlive/heartbeat/fastDetectionOfDeadBackend,那么:

1)应该在哪一层实现这样的心跳?网址?tcp?

2)任何标准框架/库/设置/等已经实现了吗?(如果可能:Java、REST)


更新

我还研究了 WADL/WSDL 的心跳实现器,虽然没有找到 REST,但检查了 WebSockets... 还研究了 TCP-keepalives,这似乎是该任务的正确功能:

但根据那些我必须设置类似的东西:

  • tcp_keepalive_time=5
  • tcp_keepalive_intvl=1
  • tcp_keepalive_probes=3

这似乎是一个反建议(建议 2 小时,10 分钟已经作为一个奇数呈现,5 秒理智/安全??如果是 - 可能是我的预先解决方案......)

我应该在哪里配置这个?单独在 London04 上还是在 Main 上?(如果我在 Main 上设置它 - 它不会淹没客户端 - > Main 前端通信吗?或者站点之间的 NAT/etc 是否会轻易破坏 keepalive 意图/支持?)

PS 欢迎任何指向 RTFM 的链接 - 我可能只是遗漏了一些明显的东西 :)

0 投票
1 回答
1426 浏览

postgresql - Postgres 的 tcp_keepalives_idle 未更新 AWS ELB 空闲超时

我在 Postgres 前面有一个 Amazon ELB。这是出于与 Kubernetes 相关的原因,请参阅此问题。我正在尝试解决 1 小时的最大AWS ELB 空闲超时限制,这样我就可以让客户端执行长时间运行的事务而不会被 ELB 断开连接。在我的情况下,我无法控制客户端配置,因此任何解决方法都需要在服务器端进行。

我遇到了tcp_keepalives_idlePostgres 中的设置,理论上应该通过向客户端发送定期保活数据包来解决这个问题,从而创建活动,因此 ELB 不会认为客户端处于空闲状态。

我尝试通过将idle timeoutELB 上的 设置为2 minutes. 我设置tcp_keepalives_idle为 30 秒,这应该强制服务器每 30 秒向客户端发送一次 keepalive。然后我通过负载均衡器执行以下查询psql -h elb_dns_name.com -U my_user -c "select pg_sleep(140)":2分钟后,ELB断开客户端。为什么keepalives没有通过客户端?有什么东西pg_sleep可能会阻止他们吗?如果是这样,是否有更好的方法来模拟长时间运行的查询/事务?

我担心这可能是一次深入的研究,我可能需要带出tcpdump或类似的工具。不幸的是,随着所有 k8s 的喋喋不休,事情的解析确实变得有点复杂。所以在走这条路之前,我想看看我是否遗漏了一些明显的东西。如果没有,任何关于如何最好地确定是否通过 ELB 实际将 keepalive 发送到服务器并最终到达客户端的提示将不胜感激。

更新:我就此联系了亚马逊。显然idle被定义为不通过网络传输dataData被定义为任何具有有效负载的网络数据包。由于 TCP keep-alives 没有有效负载,因此客户端和服务器 keep-alives 被认为是空闲的。因此,除非有办法让服务器在其保持活动负载中发送数据,或以其他形式发送数据,否则这可能是不可能的。

0 投票
1 回答
1044 浏览

java - Apache HttpClient - 使用 SSL 或 TLSv1.2 时忽略 keepalive

我正在为我的肥皂网络服务使用 Apache HttpClient 4.5。

目前,我遇到了使用 TLSv1.2 时忽略 httpclient 中的 keep alive 的问题。但是,如果使用 HTTP,keep alive 是有效的。

你们有什么想法吗?

我的代码如下所示:

主类:HttpClientPool.java

触发类:webServiceClient.java

0 投票
1 回答
431 浏览

elasticsearch - 为什么 NEST 包含 TCP 保持活动?

我注意到 NEST 能够设置 TCP 保持活动状态。

这试图解决什么问题?

我以为http keep alive就够了,在NEST的内部连接池中默认实现了吗?

有人可以阐明这里的差异,以及我们应该使用哪些场景。

谢谢

0 投票
1 回答
468 浏览

postgresql - 使用 haproxy 了解客户端和 cockroachdb 之间的 keepalive

我们面临一个问题,我们的客户将其命名为A。正在尝试通过 ha-proxy连接数据库服务器(Cockroach)名称B负载平衡

现在,当我们的客户端 A 收到Broken Pipe错误时。

但我无法理解为什么?

Cockroach 服务器已经具有以下默认值,即 60 秒。

另外,我们的 haproxy 配置具有以下设置。

选项clitcpka

那么是什么导致 TCP 连接在每一端都启用 keepalive 时断开。

0 投票
1 回答
571 浏览

c - 如何检测 TCP 保持活动数据包并保持连接打开

我用 epoll 编写了自己的服务器。当我从客户端向服务器发送 TCP 保持活动包时,不会触发 epoll 事件。问:我希望我的服务器在服务器获取 tcp keep alive 包时保持连接打开。

我还尝试查看 tcp 信息,但是当服务器获得保持活动包时,它的属性没有更新。

我了解 tcp keep alive 包不是数据,而是标头。我在我的 tcpdump 中看到,内核在收到 keep alive 包后发回 tcp keep alive ACK。我的目标是在保持活动到达时保持连接打开(类似于我服务器中的重置计时器,我的服务器可以在没有 tcp 真实数据的情况下关闭连接)

我设置我的客户端建立连接并发送数据(例如“hello world”)然后将保持活动包发送到服务器。

我的服务器是 epoll 触发的。我也已经尝试将我的服务器设置为非阻塞。

(我在互联网上发现的大多数问题都与客户端有关,我的问题更多是针对 tcp keep alive 的服务器或接收方,如何保持打开状态)

0 投票
1 回答
186 浏览

c - 为什么 TCP keep-alive 数据包不会触发 I/O 事件?是不是因为没有有效载荷或序列号比连接的序列号小 1

我想让我的应用程序层在我的服务器收到 Keep Alive 数据包时得到通知。我想知道 Keep Alive 数据包不触发 I/O 事件的原因是什么。是不是因为TCP Keep Alive包没有数据或者序号比连接的序号少1。

我做了一些测试,让我的客户发送 Keep Alive Packets。我的服务器使用 epoll 但没有被触发。

我还想知道如果我填充一个字节来保持活动数据包数据/有效负载,我的应用程序会收到通知/I/O 事件/Epoll 触发吗?

0 投票
1 回答
1216 浏览

go - Keep-alive:死节点检测

我在 macOS localhost 上运行用 Go (1.12) 编写的客户端和套接字服务器。

服务器在 net.TCPConn 上设置 SetKeepAlive 和 SetKeepAlivePeriod。
客户端发送一个数据包然后关闭连接(FIN)或客户端突然终止。

Tcpdump 显示即使在客户端关闭连接后,服务器也会继续发送保持活动探测。
它不应该检测到对等方“已死”并关闭连接吗?

这个问题很笼统,如果我缺少一些基础知识,请随时澄清。