我遇到了有关TCP套接字keepalive的问题。
在套接字连接后启用并配置TCP keep-alive,并且系统具有自己的TCP keep-alive配置。
的-to'可以显示连接的保持活动信息。
网络接口是PPPOE设备,如果我们将接口打开,它将获得一个新的IP地址。并且旧的TCP连接将一直保持建立状态,直到保持活动超时为止。
但有时'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)
我不知道为什么将“计时器”更改为“持久”,这会使保持活动被禁用。
答案 0 :(得分:1)
简而言之:TCP keepalive仅在连接空闲时(即无数据要发送)才有意义。相反,如果仍然有数据要发送,但由于缺少ACK或窗口为0而导致当前无法发送数据,则其他超时是相关的。这可能是您遇到的问题。
有关更详细的信息,请参见The Cloudflare Blog: When TCP sockets refuse to die。