Mensagens diferentes enviadas no mesmo soquete são sempre recebidas na ordem FIFO do outro lado?
Não consigo encontrar essa informação em lugar nenhum, sei que o TCP reordena os pacotes, mas também conta para mensagens separadas na mesma conexão?
Se não, o que é uma classe Java para comunicação de rede que preserva a ordem FIFO entre dois pares?
Editar:
Como um comentário apontou, não há mensagens nos soquetes. O que eu estava me referindo é o uso de:
ObjectOutputStream writer = new ObjectOutputStream(socket.getOutputStream());
writer.writeObject(obj1);
writer.writeObject(obj2);
Esses objetos são concedidos para serem recebidos na mesma ordem?
Os soquetes não são fluxos de mensagens. A abstração não suporta esse conceito. Da mesma forma, o TCP é um protocolo para enviar uma sequência de bytes.
Um Socket entrega um fluxo de bytes ao destinatário na mesma ordem em que o remetente os enviou. A implementação do protocolo TCP garante 1 que os dados não sejam reordenados. O fato de que os pacotes de rede reais podem ser descartados, retransmitidos e/ou recebidos fora de sequência é tratado pelas pilhas de protocolos.
(Você pode projetar e implementar um protocolo de aplicativo baseado em mensagem que usa o TCP como seu protocolo de transporte. Por exemplo, designe valores de byte específicos para significar o início e o fim de uma mensagem. As mensagens no nível do aplicativo não serão reordenadas pelo TCP, pois o fluxo de bytes que os representa não é reordenado.)
1 - Devo qualificar isso. TCP / IPv4 usa uma soma de verificação (um CRC de 16 bits) em cada pacote de rede para proteger contra erros de transmissão. No entanto, é teoricamente possível que o pacote seja corrompido de forma que dois bytes sejam transpostos e o CRC ainda seja válido. A "garantia" ignora isso.
Já explicamos que os sockets preservam a ordem dos bytes. Portanto, se qualquer reordenação ocorrer no código acima e no código de recebimento correspondente, isso será resultado de algo nas APIs
ObjectOutputStream
e .ObjectInputStream
Não encontrei nada nos javadocs ou na especificação de serialização de objetos Java que declare explicitamente que os objetos são gravados e lidos na mesma ordem. No entanto, é assim que o protocolo e as APIs são projetados para funcionar e como a implementação realmente se comporta.
Sim.
Você pode verificar isso examinando o código-fonte das respectivas classes na base de código OpenJDK. (Qualquer versão.)
Não, mensagens diferentes enviadas no mesmo soquete não têm garantia de recebimento na ordem FIFO (primeiro a entrar, primeiro a sair) da outra extremidade. Os soquetes operam na camada de transporte da pilha de rede e estão sujeitos às características da rede subjacente, que podem introduzir variabilidade nos tempos e na ordem de entrega das mensagens devido a fatores como congestionamento da rede, alterações de roteamento e variação dos caminhos dos pacotes. Embora o TCP (Protocolo de Controle de Transmissão) forneça entrega confiável e ordenada de dados, ele não garante que mensagens de soquetes diferentes cheguem na mesma ordem em que foram enviadas. Os aplicativos que dependem da ordem das mensagens podem precisar implementar seus próprios mecanismos de sincronização ou contar com protocolos que ofereçam garantias de ordem mais fortes, se necessário.