Skip to content

4.12 TCP 连接,断电、进程崩溃、网络中断

  • 客户端崩溃:
    • 没有开启保活,服务端的 TCP 连接会一直处于established状态,直到重启
      • 如果期间数据交互,会不断重试,超过最大次数断开
    • 如果开启保活,会不断探测,直到超过最大次数断开
    • 如果客户端迅速重启,但是连接的 socket 找不到了,会回复 RST 报文,重置连接
  • 进程崩溃:
    • 内核会挥手进程的所有 TCP 连接资源,会完成 TCP 四次挥手的过程
  • 网络中断:
    • 网络中断后,两端的 socket 依旧存在
    • 如果这个时候进行数据传输,会不断重试,如果重试期间连接上了,那么恢复正常,否则断开连接
      • 开启保活一定会进行数据传输
  • 任何一端丢掉了 socket 文件,都会发送 RST 报文请求重置连接

TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?

这两个完全是两样不同东西

  • HTTP 的 Keep-Alive
    • 应用层(用户态) 实现的,称为 HTTP 长连接;
    • 为 HTTP 流水线(客户端一次发送多个请求,服务端依次响应)提供基础
  • TCP 的 Keepalive
    • TCP 层(内核态) 实现的,称为 TCP 保活机制;
    • 如果两端的 TCP 连接一直没有数据交互,达到触发条件,会发送探测报文,
      • 收到确认报文,保活时间重置,等待下一次保活。
      • 没收到,连续探测,达到上限,会中断连接。

可以通过Linux内核中的保活参数进行设置

bash
net.ipv4.tcp_keepalive_time=7200# 保活时间,如果保活时间内没有相关的活动,启动保活机制 
net.ipv4.tcp_keepalive_intvl=75 # 探测间隔时间
net.ipv4.tcp_keepalive_probes=9 # 总的探测次数

正在精进