更改 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。
我遇到了一个关于 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。