0

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

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

考虑以下示例场景:

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

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

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

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

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

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

还有什么?

谢谢,

史蒂夫

4

1 回答 1

0

我的答案是针对 Linux,尽管我认为 Windows 服务是一样的。

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

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

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

于 2017-08-28T22:36:04.167 回答