当网络突然终止时 TCP 连接会发生什么

当网络突然终止时 TCP 连接会发生什么

假设用户空间应用程序与某个非本地端点有 TCP 连接。在某些时候,网络突然中断(即在网络管理器中删除连接、拔下 WiFi 适配器、切断以太网电缆)

从概念上讲,内核内部发生了什么来应对这种情况,以及它如何向用户空间应用程序表现出来?

指导性子问题:

  • 涉及哪些超时?
  • 在尝试重新连接时,内核是否会尝试向用户空间隐藏连接丢失?
  • 等待响应会导致用户空间应用程序不想正常退出吗?

答案1

网络接口或其他基础设施发生故障并不一定意味着“连接丢失” - TCP 可能会在终止连接之前长时间尝试重新传输(取决于发生了什么 - 本地接口上的错误可能会导致立即错误,但沿路径某处下降的路由器可能不会)。

这不取决于内核,而是由 TCP 协议决定,并且“用户空间应用程序”很可能会等待很长时间才能在套接字上收到错误。

具体回答每个子问题:

  • 我见过超时前最多 9 分钟的建议(我认为其中一些超时可能是可配置的,只要协议允许,并且可以配置 TCP keepalive 之类的东西来提前导致超时);
  • 内核不会隐藏东西,或者尝试“重新连接”,它只是遵循 TCP 协议,不断地重新尝试发送未确认的段...“用户空间应用程序”只是挂起在系统调用中(例如 write ()、sendto() 等),即“用户空间应用程序”在内核模式下运行,它的上下文被切换出去,并且不会切换回来,直到某个事件使进程再次“可运行”;
  • 挂起时,“用户空间应用程序”可能是“不可中断的”,这意味着你无法杀死它,即使你使用 SIGKILL (即 Kill -9)作为 root - “优雅退出”可能不是一个选项(尽管,我不这样做)认为在套接字上发送不会发生这种情况,它必须被认为是短期和高优先级的事情 - 例如,通过硬安装和未设置 intr 标志写入 NFS 上的文件可以做到这一点)...但即使它是一个选项,“应用程序”也必须编写为捕获错误并自行优雅退出 - 如果内核使“应用程序”退出,它不会优雅:-)(例如,它不会运行 exit处理程序或释放“应用程序”外部分配的资源等)

相关内容