首页 > 解决方案 > TCP中的乱序数据

问题描述

我有一个应用程序使用 Apache mina 库进行基于 TCP 的通信。apache mina 库提供了一个带有 IOBuffer 的回调,其中包含来自网络的数据,但通常数据是无序或冗余接收的。我浏览了 TCP 协议,它说该协议始终确保以正确的顺序传递数据。为其服务器提供 API 的公司声称他们正在使用 TCP/IP 发送响应,但是在将响应发送回之前,他们的服务器并不关心确认客户端(在这种情况下是我的应用程序/apache mina 库)已连接到服务器。所以服务器只是触发消息并继续前进。

如果我没记错的话,那是 UDP 协议的行为。我的问题是,如果服务器使用 TCP 发送回响应:

  1. 为什么我会出现乱序数据(这种情况很少见,但偶尔会发生)?
  2. 一台使用 TCP 协议的机器如何在发送数据之前不确保接收设备连接到它的情况下触发并忘记数据?
  3. 这真的是 TCP 或 UDP 还是 TCP 协议的某种变体?

标签: javanetworkingtcpprotocolsapache-mina

解决方案


Apache Mina 在包括 TCP 在内的各种传输之上进行异步消息传递。

由于 Mina 是异步的,因此应该可以预料到无序交付。

为什么我会出现乱序数据(这种情况很少见,但偶尔会发生)?

一种可能的解释是正在使用多个 TCP 流。使用一个 TCP 流传送的数据将按顺序传送,但如果使用多个流,一个流中的数据可能会“超过”另一个流、发送端或接收端的 TCP 堆栈、网络或客户端库。

一台使用 TCP 协议的机器如何在发送数据之前不确保接收设备连接到它的情况下触发并忘记数据?

因为......可靠的交付不是米娜的基本属性。

如果您使用 Mina 与具有特定应用程序协议的服务通信,则该协议将确定“在检查接收器是否连接之前发送数据”是否允许/是否有效。例如,它不会用于 HTTP 响应,因为 HTTP 响应是在先前为发送请求而建立的连接上发送的。

实际上,似乎有多种方法可以使用 Mina。有些涉及应用程序协议;例如看到HttpClientCodecHttpServerCodec。其他人没有。

这真的是 TCP 或 UDP 还是 TCP 协议的某种变体?

如果他们说 TCP 被用作传输,那么它就是。但是,Mina 既不是 TCP 也不是 UDP。是米娜。它隐藏了传输的细节。


底线,如果您想要 TCP/IP 的可靠性/按顺序交付属性,您可能应该直接使用它们。Mina 通过放宽(单个)基于流的传输的正常属性,通过同步套接字提供比传统 TCP/IP 更高的性能。


推荐阅读