据我所知,有两种方法可以解决半开连接问题。一是心跳技术。另一个是我的问题: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有时不发送呢?以及如何确保始终可以发送保活探测。我应该做点别的吗?
感谢您的所有帮助。
编辑
- 正如@West所说,卡住是来自未确认传输后的指数退避,但为什么重传会卡住发送保持活动探测的过程?有什么优先事项吗?