gpt4 book ai didi

java - 检测不可靠网络上的 TCP 丢失

转载 作者:可可西里 更新时间:2023-11-01 02:33:43 24 4
gpt4 key购买 nike

我正在使用非常基本的 java 套接字编程在不可靠的 radio 网络(自制)上进行一些实验,以在端节点之间来回传输消息。

设置如下:

节点 A --- 中继节点 --- 节点 B

我经常遇到的一个问题是连接以某种方式断开,节点 A 或 B 都不知道链路已断开,但仍继续传输数据。 TCP 连接也不会超时。我在心跳消息中添加了一段时间后导致超时的消息,但我仍然想知道TCP不超时的根本原因是什么。

以下是我在设置套接字时启用的选项:

channel.socket().setKeepAlive(false);
channel.socket().setTrafficClass(0x08); // for max throughput

这种行为很奇怪,因为它与我使用有线网络时完全不同。在有线网络上,我可以通过拔出以太网线来模拟断开的连接,但是,一旦我重新插入以太网线,连接就会重新建立并且消息将再次开始传递。

在 radio 网络上,连接永远不会重新建立,一旦它悄无声息地消失,消息就永远不会恢复。

是否有其他一些我可以使用的套接字的未知 Java 实现或设置,另外,为什么我一开始会看到这种行为?

是的,在任何人说什么之前,我知道 TCP 不是不可靠网络的首选,但在这种情况下,我想确保没有数据包丢失。

最佳答案

TCP 协议(protocol)被设计为安静的。 RFC 要求 keepalive 心跳频率不超过 2 小时。除非你可以控制两端的系统来更改默认的 2 小时心跳(有时,它需要内核重建),否则你必须在你自己的应用程序中添加心跳。

如果发送heartbeat,还是需要等到Retransmit Timeout,根据RTT的不同而不同。在高延迟网络上,超时可能会非常高,但应该在几分钟内。

您会在本地网络上收到通知,因为系统可以检测链路断开状态并断开该网络上的所有连接。

顺便说一句,您希望将 Keepalive 设置为 TRUE,而不是 false。使用 Keepalive,您至少可以得到缓慢的心跳。

关于java - 检测不可靠网络上的 TCP 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2852047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com