Além de não obter informações detalhadas sobre sua configuração de teste, o principal problema parece ser que você use um tamanho de mensagem de 64 bytes. Isso está longe do MTU usual de 1500 bytes e torna o UDP altamente ineficiente: enquanto o TCP mescla vários envios em um único pacote (exceto se TCP_NODELAY estiver definido) para fazer uso eficiente do link, cada mensagem UDP resultará em um pacote separado. Em números: cerca de 23 mensagens com tamanho de 64 bytes serão combinadas em um único pacote TCP de tamanho de MTU, enquanto serão necessários 23 pacotes únicos para o UDP para a mesma quantidade de dados. Cada um desses pacotes significa sobrecarga com o envio do host, transmitindo no fio e recebendo pelo peer. E, como vimos no seu caso, cerca de 80% dos pacotes UDP são perdidos porque seu hardware não é rápido o suficiente para transmitir e receber todos esses pacotes.
Então, o que você pode aprender com esse benchmark é:
- O UDP não é confiável (80% de perda de pacotes)
- O UDP é ineficiente se usado com tamanhos de pacote muito abaixo do MTU
- O TCP é altamente otimizado para aproveitar ao máximo o link
Quanto à sua expectativa, o UDP deve ser melhor: você já se perguntou por que todas as grandes transferências de arquivos (ftp, http, ...) são feitas com protocolos baseados em TCP? O benchmark mostra o motivo.
Então, por que as pessoas usam o UDP?
- Com dados em tempo real (por exemplo, voz sobre IP), você não se importa com mensagens antigas, portanto, não deseja que o remetente combine mensagens em pacotes maiores para fazer uso efetivo do link. E você prefere aceitar que um pacote se perca do que chegar tarde demais.
- Com links de alta latência (como os satélites), o comportamento padrão do TCP não é o ideal para fazer uso efetivo do link. Assim, algumas pessoas mudam para UDP neste caso e reimplementam a camada de confiabilidade do TCP e a otimizam para links de alta latência, enquanto outras ajustam a pilha TCP existente para fazer melhor uso do link.
- dados de "jogar fora": às vezes é mais importante enviar os dados e não se importar com a perda de pacotes, como com as mensagens de log (syslog)
- Interações curtas: com o TCP você precisa estabelecer uma conexão e manter um estado, que custa tempo e recursos no cliente e no servidor. Para interações curtas (como curto pedido e resposta) isso pode ser muito sobrecarga. Por causa disso, o DNS geralmente é feito com o UDP, mas ele criou novas tentativas sobre o UDP.