我正在尝试了解以下方案的典型行为。请注意,我愿意为任何操作系统(* nix,Windows,...)找到更多有关此边缘情况的信息。
如果某个应用程序被阻止等待或者一个延迟的套接字关闭,那么重启机器会发生什么?
请考虑以下示例场景:
应用程序具有已建立的TCP套接字,然后在套接字上调用close()。套接字配置为逗留(SO_LINGER),比如10秒。
由于设置了延迟,应用程序会阻塞,等待(最多)连接上TX / RX / ACK剩余数据的10秒延迟时间。
在此期间,内核将重新启动(例如,用户重新启动计算机)。
在这种情况下内核会做什么?
是否强制套接字关闭(“中止关闭”)?导致任何未发送/未发送的数据丢失?
或者它是否尊重逗留时间并等待(可能)整整10秒? (因此阻止重启,可能直到整个10秒的延迟时间到期)。
还有别的吗?
谢谢,
史蒂夫
答案 0 :(得分:0)
我的答案是针对Linux的,虽然我认为Windows服务是相同的。
这取决于机器的重启方式。如果它经历了正常的关闭过程,则TCP套接字的行为与应用程序正常关闭时的行为相同。因为这就是发生的事情。
如果应用程序没有在init系统的超时时间内关闭,它将被SIGKILL杀死并停止运行。已经写入套接字内核缓冲区的数据将被发送,就像没有设置SO_LINGER一样。任何没有缓冲的东西都会丢失。
一旦init系统完成,它实际上将通过reboot
系统调用重启机器。见man 2 reboot
。这会立即重新启动机器。它甚至不等待磁盘同步。它肯定不会等待TCP套接字。您可以使用reboot -n -f
从命令行获得此效果。内核的TCP套接字缓冲区中的任何数据都将丢失。