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

标签 java networking tcp

我正在使用非常基本的 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/

相关文章:

java - AWS Java SDK 凭证 linux ec2

android - 服务器托管仅允许授权 IP 访问数据库

iPhone 最大套接字缓冲区大小

java - 在 Java 中将英特尔十六进制字符串转换为普通十六进制

Java 对象到 XML 模式

c# - 在 C# 中构造类/结构的最佳方法

security - 如果发起者受到威胁/有意作弊,TLS 是否可以防止重放攻击

go - 写入特定的 bytes.Buffer 偏移量

java - 归并排序的基本条件

hadoop - 在 Hadoop 中存储用于计算的图形的有效方法