服务器宕机后,已建立的TCP连接不会立刻消失,而是先“僵住”:客户端继续发数据却收不到确认,内核反复重传,直到超时判定连接失效;如果服务端进程崩溃但主机还在,客户端往往秒级收到RST,直接报连接重置。理解这个差别,才能判断线上故障时用户到底会卡多久、系统该配多长超时。
TCP连接不是一根电线,服务器宕机后它先“假死”
把TCP连接想成两个人打电话,正常通话时,一方说一句,另一方“嗯”一声,服务器宕机相当于对面突然把电话线拔了,但客户端这边听不到忙音,只能继续自说自话。
服务器安静消失:数据包石沉大海
机房断电、宿主物理机故障、内核崩溃,都属于这一类,服务端不会再发任何包,客户端发出去的SYN、ACK、数据段全部没有回应,TCP协议栈不会马上告诉应用“对方没了”,它选择重传,重传次数用完,才把错误交给上层。
进程崩溃但机器还在:RST比沉默更干脆
如果只是某个服务进程崩溃,操作系统还活着,内核会替它收尾,已建立的socket被关闭时,内核通常发FIN走正常关闭;如果接收缓冲区里还有没读完的数据,内核会直接发RST,客户端收到RST,read或write立刻返回“Connection reset by peer”,用户感知就是页面突然报错,而不是一直转圈。
据Linux内核文档的默认参数,已建立连接的重传上限由net.ipv4.tcp_retries2控制,默认值15,按指数退避估算,从开始重传到内核放弃,大约是十几分钟量级,这个数字不是秒级故障切
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/796221.html


