A agregação de links 802.3ad (e muitas outras técnicas de caminhos múltiplos) normalmente dividem o tráfego entre vários links em uma base por fluxo, não por pacote - e por uma boa razão: sempre haverá uma ligeira diferença na transmissão atraso em cada link. Talvez uma interface tenha um driver mais eficiente, ou maior prioridade de interrupção, ou o cabo seja um pouco mais curto para que os elétrons possam chegar lá mais rápido (seriamente). Seja qual for o caso, é extremamente comum que os pacotes cheguem ao destino em uma ordem diferente daquela em que foram enviados.
Muitos pacotes fora de ordem são geralmente uma Coisa Ruim porque o TCP somente reconhece o último pacote recebido na ordem . Os pacotes fora de ordem resultarão no envio de TCPs ACKs duplicados, que são interpretados pelo TCP como indicativos de congestionamento, fazendo com que o TCP fique lento (ou até mesmo retransmita desnecessariamente se o TCP retransmitir rapidamente for disparado).
Nada disso é um problema, é claro, se cada conversa estiver restrita a um único link. Ninguém se importa se o pacote de uma conversa for reordenado com um pacote de outra conversa.
Assim, a maioria das implementações de caminhos múltiplos seleciona o link físico de saída executando um algoritmo de hash em alguns campos de cabeçalho. Normalmente, os campos de cabeçalho analisados seriam uma combinação de:
- src-ip
- src-port (or possibly another identifier if not TCP/UDP)
- dst-ip
- dst-port (or possibly another identifier if not TCP/UDP)
- ip-proto
- vlan-id
Assim, para cada pacote, os valores de cada um desses campos são reunidos e o resultado determina qual interface enviar o pacote. Em média, se houver muitos fluxos diferentes, uma quantidade semelhante de tráfego terminará em cada link. Se você tiver apenas um fluxo, todos esses campos serão os mesmos para cada pacote, então cada pacote terminará no mesmo link.
Se você tem dois fluxos, basicamente está apostando 50/50 que os dois fluxos estarão em links diferentes, o que é exatamente o que você está vendo. Se você tiver azar, você pode jogar os dados novamente, alterando qualquer uma das variáveis que são consideradas pela função hash: tente uma porta diferente, por exemplo. De fato, ao ativar a marcação 802.1q, você introduziu um ID-vlan na mistura que aparentemente mudou o resultado do hash.
Além disso, não há uma maneira padrão de executar o hash, o que significa que, se você conectou sistemas de fornecedores diferentes (ou mesmo versões diferentes de software do mesmo fornecedor), cada lado pode executar o hash de uma maneira diferente. dois fluxos específicos podem acabar com links diferentes do servidor para o switch, mas o mesmo link do switch para o servidor.
A conclusão é que o 802.3ad e outras técnicas de múltiplos caminhos em nível de pacote são necessariamente baseadas em fluxo e funcionam muito bem se você tiver muitos fluxos diferentes, mas não são adequados para um pequeno número de grandes fluxos.