【问题标题】:What happens to lingering sockets when the kernel reboots?当内核重新启动时,延迟套接字会发生什么?
【发布时间】:2018-02-06 02:14:24
【问题描述】:

我试图了解以下场景的典型行为。请注意,我愿意为任何操作系统(*nix、Windows、...)找到更多关于这种边缘案例的信息。

如果应用程序被阻塞等待或延迟套接字关闭,当机器重新启动时会发生什么?

考虑以下示例场景:

  1. 应用程序已建立 TCP 套接字,然后在套接字上调用 close()。套接字配置为逗留 (SO_LINGER) 10 秒。

  2. 由于延迟设置,应用程序会阻塞,等待(最多)10 秒的延迟时间以 TX/RX/ACK 连接上的剩余数据。

  3. 在此期间,内核重新启动(例如,用户重新启动机器)。

在这种情况下内核会做什么?

它是否强制套接字关闭(“中止关闭”)?导致任何未发送/未确认的数据丢失?

或者它是否尊重逗留时间并等待(可能)整整 10 秒? (因此阻止重新启动,可能直到整整 10 秒的逗留时间到期)。

还有什么?

谢谢,

史蒂夫

【问题讨论】:

  • 套接字不复存在。传入帧将导致 ICMP 启动,因此对方会注意到。
  • 这在很大程度上取决于您的操作系统。
  • 简而言之:你可以和死人说话,但他不会顶嘴。此外:fresh 内核没有连接端点(处于正确状态)。并且总是有第一个序列号。
  • @n.m.正确的。我试图了解这通常是如何在不同的操作系统中处理的。基本上,寻找任何人可能对此有任何见解,适用于任何操作系统。
  • @wildplasser 谢谢。是的,一旦内核真正关闭,套接字将不复存在。但是,我正在研究内核实际关闭之前的时间。内核会在延迟套接字上执行“异常关闭”吗?还是等待逗留时间到期?

标签: c sockets so-linger


【解决方案1】:

我的答案是 Linux,虽然我认为 Windows 服务是一样的。

这取决于机器的重启方式。如果它通过正常的关闭过程,TCP 套接字的行为将与应用程序正常关闭时的行为相同。因为这就是发生的事情。

如果应用程序没有在 init 系统的超时时间内关闭,它将被 SIGKILL 杀死并停止运行。已经写入套接字内核缓冲区的数据将被发送,就像未设置 SO_LINGER 一样。任何未缓冲的内容都会丢失。

一旦初始化系统完成,它实际上会使用reboot 系统调用重新启动机器。见man 2 reboot。这会立即重新启动机器。它甚至不等待磁盘同步。它当然不会等待 TCP 套接字。您可以使用reboot -n -f 从命令行获得此效果。内核的 TCP 套接字缓冲区中的所有数据都将丢失。

【讨论】:

  • 如果在重新启动之前没有发送任何 缓冲的内容,也可能会丢失。
  • @EJP:是的。见最后一句。 :)
  • @ZanLynx 非常感谢您的回答,我认为这很清楚。
  • 感谢大家的帮助!非常感谢您的回答。
猜你喜欢
  • 2014-06-12
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2016-11-19
相关资源
最近更新 更多