0

据我所知,有两种方法可以解决半开连接问题。一是心跳技术。另一个是我的问题:keep-alive

我知道keep-alive具有三个属性,例如:

tcp_keepalive_time\tcp_keepalive_intvl\tcp_keepalive_probes。

我将它们设置为

5秒\1秒\10

这意味着keepalive例程在发送第一个keepalive探测之前等待5秒,然后每1秒重新发送一次。如果连续 10 次没有收到 ACK 响应,则连接被标记为断开。

我确实启用了 keep-alive并通过调用setsockopt()在我的 linux C++ 代码中为其设置了这些属性,有时,它可以正常工作,如下所示:

连续十次

但在其他时候,keep-alive DOES NOT发送,并且重传 msg 已发送并被卡住:

在此处输入图像描述

它只发送7次(每次重发之间的时间大于1秒,几乎是2~5秒)。然后卡了很久。

那么为什么 TCP keep-alive有时不发送呢?以及如何确保始终可以发送保活探测。我应该做点别的吗?

感谢您的所有帮助。

编辑

  1. 正如@West所说,卡住是来自未确认传输后的指数退避,但为什么重传会卡住发送保持活动探测的过程?有什么优先事项吗?
4

1 回答 1

0

在我看来,这就像未经确认的传输后的指数退避。TCP_MAXRT 将允许您设置在放弃尝试传输之前要等待多长时间。TM_TCP_MAX_REXMIT 将让您设置最大重试次数。

于 2013-09-23T04:26:01.807 回答