linux TCP / IP编程中的确切时间保持活动状态

时间:2013-09-23 03:39:09

标签: c++ linux sockets tcp keep-alive

据我所知,解决the Half-Open connection problem的方法有两种。一个是心跳技术。另一个是我的问题: keep-alive

我知道 keep-alive three properties喜欢:

tcp_keepalive_time \ tcp_keepalive_intvl \ tcp_keepalive_probes。

我将它们设置为

5secs \ 1sec \ 10

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

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

ten consecutive times

但在其他时间,保持活动 不会发送,而重传的消息已被发送并被卡住了:

enter image description here

它只发送7次(每次重发之间的时间大于1秒,差不多2~5秒)。然后坚持了很长时间。

为什么TCP keep-alive 有时不发送?如何确保始终发送 keep-alive 探针。我应该做其他的吗?

感谢您的帮助。

修改

  1. 正如@West所说,卡住是在未经确认的传输之后来自指数退避,但为什么重传会阻止发送 keep-alive 探测的过程?是否有任何优先权或什么?

1 个答案:

答案 0 :(得分:0)

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