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

Asynchronous 关于TCP/IP:如果接收方系统在接收消息时中途崩溃,消息是否会永远丢失,asynchronous,tcp,synchronous,Asynchronous,Tcp,Synchronous,我有两个关于使用TCP/IP从系统A向系统B发送消息的新手问题 问题1:如果系统B崩溃,消息是否会永远丢失? 1:系统A通过TCP/IP传输向系统B发送消息 2:系统B收到消息,系统B在中途收到消息时崩溃 3:如果系统B在2分钟后成功恢复,系统B能否再次收到该消息?(系统A只发送一次)消息是否永远丢失 Qns 2:如果系统B崩溃,异步或同步TCP/IP是否能够恢复消息? 当有人告诉我异步或同步可以执行消息回滚时,我会问这个问题。不确定它们是否与消息队列混淆。 我已经阅读和谷歌的信息。异步或同步T

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

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

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

谢谢

简言之,不用了

这有几个原因。首先,TCP模拟IP上的连接。实际上,并没有连接,原则上主机或中间路由器确实可能会停机并重新启动,并且没有人会注意到。除了嗯,除了有东西要送出去,还有一个小细节

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

此外,如果数据包被发送到物理或逻辑上不可访问的主机(例如,电缆未拔出或网卡未打开、没有ARP条目或从主机本身收到ICMP错误3),中间路由器将发送回ICMP目的地不可访问。收到此消息后,发送方知道接收方,因此连接已断开

这意味着,如果发送方仍在发送您的另一半数据,或者选择重新发送一些在接收方重新启动时超时的未确认数据,那么它将不可避免地检测到接收方已死亡

对于超时是如何发生的,没有明确的、强制性的配方或公式(估计RTT的两倍是一种方法,但可能会有不同的情况)。
但是,在任何情况下,您都可以认为在延迟期间至少会发生一次重新发送是非常安全的,例如重新启动,其中包括至少5秒的POST[1]和另外5-10秒的加载操作系统和设备驱动程序、启动网络设备、获取IP地址等

但让我们假设10秒,而不是分钟。这是一个可怕的时间,除非你是在一艘前往火星的宇宙飞船上,否则你的往返时间(因此超时和重新发送间隔)将是这个时间的一小部分。因此,如果任何未确认的数据仍然存在(这是您的问题的先决条件),则实际上可以保证连接已断开



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

您好,谢谢。回答是否不涉及问题1或2?这是对两个问题的回答。TCP始终是异步的,无论您使用的是同步API还是异步API,在任何情况下,它的行为方式都是相同的,具有相同的技术限制。