第 52 篇:TCP保活机制 协议深入系列第7篇。先扔个真实场景有一次半夜两点,服务端收到报警,说某台机器连接数异常堆积。上去一看,ESTABLISHED连接好几万,但业务QPS几乎为零。连接状态全是活的。人全没了。这就是TCP Keepalive没开的后果。连接池里全是僵尸,占着文件描述符不干活,等到业务恢复时发现连不上,还得等超时重试。后来把这个案例写进复盘,顺手把TCP Keepalive彻底撸了一遍。这玩意儿到底干嘛的TCP连接建好之后,如果双方都不发数据,这条连接可以安安静静挂在那,操作系统不会主动去问对方还在不在。对方可能早挂了:手机切了网络、NAT映射过期、防火墙清了状态、主机直接断电。但你这边TCP状态还是ESTABLISHED。Keepalive解决的就是这个问题——在连接空闲到一定时间后,主动发一个探测包,确认对端TCP栈还能不能回话。注意措辞:确认的是对端TCP栈还通不通,不确认业务还活不活。默认配置就是一个坑Linux默认值长这样:tcp_keepalive_time = 7200 tcp_keepalive_intvl = 75 tcp_keepalive_probes = 9什么意思?连接空了两小时后才开始探测,每75秒探一次,连探9次都失败才认为断了。