当内核重新启动时,延迟套接字会发生什么?

时间:2017-08-28 18:28:15

标签: c sockets so-linger

我正在尝试了解以下方案的典型行为。请注意,我愿意为任何操作系统(* nix,Windows,...)找到更多有关此边缘情况的信息。

如果某个应用程序被阻止等待或者一个延迟的套接字关闭,那么重启机器会发生什么?

请考虑以下示例场景:

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

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

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

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

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

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

    还有别的吗?

    谢谢,

    史蒂夫

1 个答案:

答案 0 :(得分:0)

我的答案是针对Linux的,虽然我认为Windows服务是相同的。

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

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

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