在同一套接字上发送的不同消息是否总是以FIFO顺序从另一端接收?
套接字不是消息流.抽象概念不支持这一概念.同样,TCP是用于发送字节序列的协议.
套接字以与发送方发送字节流相同的顺序将字节流传递给接收方.实现的tcp协议保证1数据不会重新排序.协议栈处理实际网络分组可能被无序地丢弃、重发和/或接收的事实.
(您可以设计和实现使用TCP作为其传输协议的基于消息的应用程序协议.例如,指定特定的字节值表示消息的开始和结束.应用程序级消息不会被TCP重新排序,因为表示它们的字节流不会重新排序.)
1-我应该对此进行限定.TCP/IPv4在每个网络数据包中使用校验和(16位CRC)来防止传输错误.然而,从理论上讲,分组可能以这样一种方式被 destruct ,即两个字节被转置并且CRC仍然有效."保证"忽略了这一点.
我指的是以下的用法:
ObjectOutputStream writer =
new ObjectOutputStream(socket.getOutputStream());
writer.writeObject(obj);
我们已经解释过,套接字保持字节的顺序.因此,如果上面的代码和匹配的接收代码中发生任何重新排序,那将是由于ObjectOutputStream
和ObjectInputStream
API中的某些东西造成的.
在javadoc或Java对象序列化规范中,我没有发现任何说明对象是以相同的顺序写入然后读取的内容.然而,这就是协议和API设计的工作方式,以及实现的实际行为.
是否保证以相同的顺序接收这些对象?
是.
您可以通过判断OpenJDK代码库中各个类的源代码来验证这一点.(任何版本.)