关于TCP/IP:如果接收方系统在接收消息时中途崩溃,消息是否永远丢失

About TCP/IP: Is the message lost forever if the receiver system crashes halfway while receiving the message

关于使用 TCP/IP 从系统 A 向系统 B 发送消息,我有 2 个新手问题。

Qns 1: 如果系统 B 崩溃,消息会永远丢失吗?
1:系统A通过TCP/IP传输
向系统B发送消息 2:B系统收到消息,B系统收到消息中途崩溃
3:如果系统B在2分钟后恢复正常,系统B还能收到消息吗? (系统A只会发送一次)消息是否永远丢失?

问题 2:如果系统 B 崩溃,异步或同步 TCP/IP 是否能够恢复消息?
有人问我这个问题是因为有人告诉我异步或同步都可以执行消息回滚。不确定它们是否与消息队列混淆。
我已阅读 google 以获取信息。似乎异步或同步 TCP/IP 只影响数据发送到另一个系统的方式。如果系统 B 崩溃,它没有回滚消息的概念。

谢谢

简而言之,没有。

这有几个原因。首先,TCP 模拟 IP 上的连接。实际上,没有连接,原则上 主机或中间路由器确实可以关闭并重新启动,而且没有人会注意到。除了...好吧,除了在发送东西的时候,除了另一个小细节。

对于TCP模拟的有序流连接,双方必须(至少)同意一对端口和一个序列号。这发生在连接建立期间。
重新启动后,接收机器不再知道此信息。因此,到达的数据包对网络堆栈没有意义,并且——取决于防火墙配置——要么静默丢弃,要么返回 ICMP 错误 3。无论如何,在新创建的套接字上看不到任何数据。
这也是有道理的,因为在现代计算机上通常有几个(通常是十几个或更多)进程具有网络连接。在不知道的情况下,哪个应该接收该数据?

此外,如果将数据包发送到物理上或逻辑上无法访问的主机(例如,电缆未插入或网卡未启动、没有 ARP 条目或收到 ICMP 错误),中间路由器将发回 ICMP 目标无法访问3 来自主机本身)。收到此消息,发送方知道接收方,因此连接已断开。

也就是说,如果发送方还在发送你的另一半数据,或者选择重新发送一些超时的未确认数据,而接收方正在重启,那么它不可避免地会检测到接收方已经死了。

没有明确的、强制性的方法或公式来说明超时究竟是如何发生的(将估计的 RTT 加倍是一种方法,但也可能有不同的方法)。
但是,在任何情况下,您都可以假设 至少 一次重发是在延迟期间发生的,例如重启,这涉及至少 5 秒的 POST[1] 以及另外 5-10 秒加载操作系统和设备驱动程序、调出网络设备、获取 IP 地址等。

但我们假设 10 秒,而不是分钟。那是一个 非常多的时间 ,除非你乘坐 space 飞船前往火星,否则你的往返时间(以及超时和重新发送间隔)将是这一部分。因此,如果仍有任何未确认的数据(这是您问题中的先决条件),连接实际上可以保证断开。


[1] 这甚至是乐观的,在某些服务器上,您可以有 1-2 分钟 POST,而无需实际启动。