更改 IP 地址后,TCP 套接字状态会持续存在,甚至会提前配置保持活动状态

TCP socket state become persist after changing IP address even configured keep-alive early

我遇到了一个关于 TCP socket keepalive 的问题。

TCP keep-alive在socket连接后启用并配置,系统有自己的TCP keep-alive配置。

'ss -to'可以显示连接的存活信息

网络接口是一个PPPOE设备,如果我们up接口,它会得到一个新的IP地址。并且旧的 TCP 连接会一直建立,直到 keep-alive 超时。

但有时'ss -to'显示tcp连接变成'persist',需要很长时间(约15分钟)才能关闭。

以下是'ss -to'的结果:

ESTAB   0        591           172.0.0.60:46402        10.184.20.2:4335     timer:(persist,1min26sec,14)

源地址为“172.0.0.60”,但网络接口的实际地址已更新为“172.0.0.62”。

这是'ss -to'的正确结果:

ESTAB  0        0             172.0.0.62:46120       10.184.20.2:4335    timer:(keepalive,4.480ms,0)

不知道为什么把“timer”改成'persist',让keep-alive被禁用

简而言之:TCP keepalive 仅在连接空闲时才有意义,即没有数据要发送。相反,如果仍有数据要发送,但由于缺少 ACK 或 window 为 0 目前无法发送,则其他超时是相关的。这可能是您遇到的问题。

有关更深入的详细信息,请参阅 The Cloudflare Blog: When TCP sockets refuse to die