机器 - linux,3.10.19内核
这是在一个大型分布式系统中,有几个服务器和客户端(在同一个以及不同的节点/机器上)彼此之间有TCP连接。
测试案例
客户端程序节点/机器被关闭(故意,测试用例),服务器知道断开连接的唯一方法是通过keepalive定时器(空闲时间= 40秒,4个探测器,探测时间= 10秒)。
好案例
这在大多数情况下工作正常,服务器知道客户端在[40,70]秒内出现故障。
不好的情况:
但是我遇到另一个独特的情况,当keepalive定时器运行时,服务器尝试向客户端发送一些数据,这反过来启动TCP重传定时器,它会覆盖/杀死keepalive定时器。重传定时器需要大约15分钟才能检测到另一端不再存在。
15分钟是服务器实现这一点的大量时间。我正在寻找别人处理这种情况的方法。我是否需要调整重传计时器值?
谢谢!
答案 0 :(得分:0)
重传超时有一个完全独立的配置。
来自Linux的tcp.7 man page:
tcp_retries2(整数;默认值:15;自Linux 2.2起)
重新传输TCP数据包的最大次数 在放弃之前建立的国家。默认值为15,即 对应的持续时间约为13至30分钟, 取决于重传超时。 RFC 1122指定 通常认为最短100秒的限制太短。
这可能是您需要调整的值,以更改检测连接是否消失所需的时间。
答案 1 :(得分:0)
我对linux内核版本4.3.0-1-amd64:
也有同样的问题在以下情况下,TCP保持活动机制正常对客户端和服务器起作用:
当交换机另一侧的电线被拔掉时,TCP Keep-Alive帧将被传输,直到发送一条应用消息。然后,发送TCP重传帧并停止发送TCP保持活动帧,这将阻止套接字关闭。