代码之家  ›  专栏  ›  技术社区  ›  z -

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

  •  3
  • z -  · 技术社区  · 15 年前

    设置如下:

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

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

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

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

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

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

    是否有其他一些未知的java实现或socket设置我可以使用,还有,为什么我首先看到这种行为?

    3 回复  |  直到 15 年前
        1
  •  2
  •   ZZ Coder    15 年前

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

    如果您发送心跳,它仍然需要等到重新传输超时,这取决于RTT。在高延迟网络上,超时可能非常高,但应该在几分钟之内。

    顺便说一句,您希望将Keepalive设置为TRUE,而不是false。有了Keepalive,你至少会有缓慢的心跳。

        2
  •  2
  •   Zak    15 年前

    在OSI 7层模型中,前两层是物理层和数据链路层。在有线以太网上运行数据链路协议的物理硬件可以检测何时拉电缆。你的无线硬件,和相应的协议,可能没有那么多。如果layer1/2没有发出断开连接的信号,TCP堆栈就不能超时。

        3
  •  1
  •   Len Holgate    15 年前

    定义“从不”?

    请看这里: http://www.ietf.org/rfc/rfc2988.txt ,此处: http://msdn.microsoft.com/en-us/library/ms819737.aspx 等等。

    你已经习惯了有线网络,在那里驱动程序可以通知更高级别的层,连接已经被物理破坏。如果你要配置一个有线网络通过一个路由器路由,然后你故意设置为不正确路由,那么你可能会看到类似的行为。。。。