Ordem UDP de pacotes com conexão direta

4

Se eu tiver dois sistemas (A e B) em execução na LAN (INTRANET) que estão diretamente conectados. Não há roteadores no meio. Neste caso, se o sistema A enviar alguns pacotes UDP a cada poucos milissegundos para o sistema B:

É possível que o sistema B receba os pacotes em uma ordem diferente?

Por favor, note que não estou perguntando se devo usar TCP ou UDP. Estou interessado em saber se o cenário acima terá pacotes fora de ordem - estou ciente de que não é garantido que os pacotes UDP cheguem em ordem.

    
por m4n07 03.04.2013 / 12:10
fonte

7 respostas

5

Sim, é possível.

Isso pode ser dependente de hardware e driver, e pode ser muito diferente dependendo de quais outros tipos de pacotes estão sendo enviados pela linha ao mesmo tempo.

Como os buffers internos de pacotes estão lidando com as solicitações de envio de entrada? Você não pode saber. Pode estar usando buffers paralelos que são preenchidos de maneiras estranhas. Como a especificação não tem garantia, não haveria razão para o implementador se incomodar em manter as coisas em sincronia (especialmente considerando os ganhos de velocidade com a falta de sobrecarga).

Uma caixa do Windows pode decidir enviar uma solicitação de atualização de horário do NTP e uma varredura de compartilhamento de rede e, quando estiver no meio dela, a caixa de depósito poderá fazer uma solicitação para pastas locais. Agora, todos os dados em buffers são suspeitos.

Você pode enviar milhões de pacotes e não ter esse problema. Mas é uma possibilidade. As chances de isso acontecer podem ser pequenas, mas isso acontecerá.

A única maneira real de garantir que eles não causem problemas é se você estiver executando seu próprio sistema operacional e tiver conhecimento explícito sobre o desempenho do hardware e se tiver o código-fonte do driver e o código-fonte da API UDP.

    
por 03.04.2013 / 16:49
fonte
13

Não é garantido que os pacotes UDP cheguem em ordem. Você deve usar o TCP para isso.

    
por 03.04.2013 / 12:27
fonte
2

Eles não precisam chegar nem em ordem.

Suponho que você esteja esperando que esse não seja o caso devido à simplicidade da configuração, mas ainda há um sistema de barramento subjacente e coisas como os dois computadores tentando enviar ao mesmo tempo podem acontecer.

Claro que não será com Ethernet comutada, mas você terá que destruir várias camadas de abstração para responder a sua pergunta de qualquer outra forma que não seja "talvez não".

    
por 03.04.2013 / 12:41
fonte
1

Sim, pode ser que o aplicativo no sistema B receba os pacotes UDP em uma ordem diferente daquela em que foram enviados pelo aplicativo no sistema A. Se ambos os sistemas estiverem conectados ao mesmo segmento de rede, a probabilidade de ocorrerem é pequeno, mas nunca será insignificante.

O que também pode acontecer é que os pacotes se percam, por exemplo, porque houve uma colisão entre dois pacotes em um switch ou hub conectando os sistemas.

    
por 03.04.2013 / 12:41
fonte
0

No mundo do software, lidamos com certezas e cenários estatisticamente impossíveis antes de decidir usar uma determinada solução. Se os pacotes podem / vão chegar de forma confiável e o que você planeja fazer para lidar com essa contingência, tem tudo a ver com se você deve ou não usar essa solução.

De qualquer forma, não, eles não vão chegar em ordem (ou em tudo) e se você usá-lo, você tem que lidar com isso em sua camada de transporte (s) - como a RTP faz ou algo dessa natureza.

    
por 03.04.2013 / 15:37
fonte
0

Embora a ordem ou chegada não seja garantida pela especificação, no seu contexto não vejo nenhum dispositivo que possa reordenar os pacotes ou destruí-los (desde que nenhum outro tráfego de rede esteja presente).

Apenas no caso, você pode criar um teste que você execute durante algumas horas e que envia pacotes com um número de sequência incremental no corpo e que falhará assim que o número de sequência de um pacote recebido não coincidir com o número de pacotes recebidos até o momento.

    
por 03.04.2013 / 16:35
fonte
0

É possível. Eu observei esse comportamento na conexão direta (sem hub ou switch) entre duas máquinas. No meu caso, só acontecia quando o aplicativo enviava datagramas um após o outro sem qualquer atraso entre eles. Nesse caso, isso aconteceria com alta probabilidade (acima de 1/30). Devo observar que esse comportamento era dependente de hardware - isso ocorreria apenas em uma linha específica dos computadores da Kontron. Também ocorreria somente quando o aplicativo fosse datagrama o mais rápido possível - depois de atrasar artificialmente o próximo datagrama por 1 milissegundo, eu não poderia mais observar isso.

    
por 08.05.2018 / 19:55
fonte