【发布时间】:2018-02-06 02:14:24
【问题描述】:
我试图了解以下场景的典型行为。请注意,我愿意为任何操作系统(*nix、Windows、...)找到更多关于这种边缘案例的信息。
如果应用程序被阻塞等待或延迟套接字关闭,当机器重新启动时会发生什么?
考虑以下示例场景:
应用程序已建立 TCP 套接字,然后在套接字上调用 close()。套接字配置为逗留 (SO_LINGER) 10 秒。
由于延迟设置,应用程序会阻塞,等待(最多)10 秒的延迟时间以 TX/RX/ACK 连接上的剩余数据。
在此期间,内核重新启动(例如,用户重新启动机器)。
在这种情况下内核会做什么?
它是否强制套接字关闭(“中止关闭”)?导致任何未发送/未确认的数据丢失?
或者它是否尊重逗留时间并等待(可能)整整 10 秒? (因此阻止重新启动,可能直到整整 10 秒的逗留时间到期)。
还有什么?
谢谢,
史蒂夫
【问题讨论】:
-
套接字不复存在。传入帧将导致 ICMP 启动,因此对方会注意到。
-
这在很大程度上取决于您的操作系统。
-
简而言之:你可以和死人说话,但他不会顶嘴。此外:fresh 内核没有连接端点(处于正确状态)。并且总是有第一个序列号。
-
@n.m.正确的。我试图了解这通常是如何在不同的操作系统中处理的。基本上,寻找任何人可能对此有任何见解,适用于任何操作系统。
-
@wildplasser 谢谢。是的,一旦内核真正关闭,套接字将不复存在。但是,我正在研究内核实际关闭之前的时间。内核会在延迟套接字上执行“异常关闭”吗?还是等待逗留时间到期?