据我所知,解决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>
但在其他时间,保持活动 不会发送,而重传的消息已被发送并被卡住了:
它只发送7次(每次重发之间的时间大于1秒,差不多2~5秒)。然后坚持了很长时间。
为什么TCP keep-alive 有时不发送?如何确保始终发送 keep-alive 探针。我应该做其他的吗?
感谢您的帮助。
修改
答案 0 :(得分:0)
这看起来像是在未确认的传输之后的指数退避。 TCP_MAXRT允许您设置在放弃尝试传输之前要等待多长时间。 TM_TCP_MAX_REXMIT将允许您设置最大重试次数。