Você não pode confiar no UDP para entregar pacotes em ordem, porque a especificação não fornece essas garantias. Mesmo assumindo a situação mais ideal, uma única peça de cabo ethernet entre dois hosts, ainda há a questão do SO, da pilha de rede, do driver da NIC e da implementação da libc contra a qual você está escrevendo.
Em cada passo dessa cadeia, os autores desse código terão escolhido NOT para priorizar o pedido de pacotes UDP, mesmo que eles cheguem pela simples razão de não precisarem.
Um exemplo inventado pode ser a estrutura de dados na qual os pacotes de entrada são lidos, o que pode ser um buffer de anel. Os pacotes que chegam em ordem serão colocados em ordem no buffer de anel, mas pode ser mais simples para o gravador de driver despejá-los nas camadas superiores do código de rede em ordem de memória , portanto randomizando seus arquivos. ordenação.
Considerando a sua situação, uma máquina virtual é executada em uma infraestrutura compartilhada que será executada para o volume, não para o desempenho, então a probabilidade de prever a ordem de recebimento dos pacotes UDP será baixa.
Em suma, se a especificação disser que você não pode confiar na ordenação de pacotes UDP. Você não pode confiar nisso, e você não pode tentar ajustar o ambiente para dar uma garantia mais strong do que a especificação prometida.