TCP 中的乱序数据

Out of order data in TCP

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

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

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

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

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

Why do I get out of order data (it's rare but happens one in a while)?

一种可能的解释是使用了多个 TCP 流。使用一个 TCP 流传送的数据将按顺序传送,但如果使用多个流,则一个流中的数据可能 "overtake" 另一个流上的数据、发送端或接收端的 TCP 堆栈中、网络上的数据,或者在客户端库中。

How can a machine that's using TCP protocol just fire and forget about the data without making sure the receiver device is connected to it before sending the data?

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

如果您使用 Mina 与具有特定应用程序协议的服务对话,则该协议将确定 "sending the data before checking the receiver is connected" 是否被允许/是否有效。例如,它不会用于 HTTP 响应,因为 HTTP 响应是在先前为发送请求而建立的连接上发送的。

其实Mina的使用方法好像有很多种。有些涉及应用程序协议;例如参见 HttpClientCodecHttpServerCodec。其他人没有。

Is this really TCP or UDP or some variation of TCP protocol?

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


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