我有一个使用Apache mina库基于TCP进行通信的应用程序。 apache mina库提供了带有IOBuffer的回调,该回调包含通过网络传入的数据,但是通常是无序接收或冗余接收数据。我浏览了TCP协议,并说该协议始终确保以正确的顺序传递数据。为服务器提供API的公司声称,他们正在使用TCP / IP发送回响应,但是在将响应发送回其服务器之前,它们并不关心确认客户端(在这种情况下为我的应用程序/ Apache Mina库)已连接到服务器。因此,服务器仅触发该消息并继续前进。
如果我没记错的话,那就是UDP协议的行为。我的问题是,如果服务器使用TCP发送回响应:
答案 0 :(得分:0)
Apache Mina在包括TCP在内的各种传输之上进行异步消息传递。
由于Mina是异步的,因此应该可以无序交付。
为什么我会出现乱序数据(这种情况很少见,但偶尔会发生)?
一种可能的解释是正在使用多个TCP流。使用一个TCP流传输的数据将按顺序传输,但如果使用多个流,则一个流中的数据可能“超载”另一流,发送或接收端的TCP堆栈中,网络上或其他网络中的数据。客户端库。
使用TCP协议的机器如何在发送数据之前不确保接收器设备已连接的情况下直接触发并忘记数据?
因为...可靠的交付不是Mina的基本属性。
如果您正在使用Mina与具有特定应用程序协议的服务进行通讯,则该协议将确定是否允许“将在检查接收器已连接之前发送数据” /是否有效。例如,它不会进行HTTP响应,因为HTTP响应是在先前建立的发送请求的连接上发送的。
实际上,似乎有多种使用Mina的方法。有些涉及应用程序协议。例如请参阅HttpClientCodec
和HttpServerCodec
。其他人没有。
这真的是TCP或UDP还是TCP协议的某些变体?
如果他们说TCP被用作传输,那么它就是。但是,Mina既不是TCP也不是UDP。是米娜它隐藏运输的详细信息。
最重要的是,如果您想要TCP / IP的可靠性/按顺序传递属性,则可能应该直接使用它们。通过放松(单个)基于流的传输的常规属性,Mina通过同步套接字提供了比常规TCP / IP更高的性能。