Aqui está uma citação de Sam Jansen de um comentário no gafferongames.com :
Falando como pesquisador de rede e não como desenvolvedor de jogos, a conclusão de nunca usar TCP e UDP juntos parece um pouco forte. O TCP só terá perda de pacotes se estiver enviando muitos dados; de certa forma, assim como os dados UDP que você está enviando. A diferença é que você não tem controle direto sobre a taxa que o TCP envia, isso está oculto para você.
Se você apenas precisar enviar alguns dados confiáveis e não quiser se preocupar com retransmissão e implementação de um protocolo confiável, e souber que a taxa será baixa, não haverá problemas ao usar o TCP e o UDP.
O relacionamento não é tão complexo entre os dois: o TCP apenas aumenta sua taxa de envio (se houver dados a serem enviados) até obter perda de pacotes; nesse caso, ele retorna sua taxa e começa a aumentar novamente a taxa (isso tempo mais devagar). Quando seu aumento na taxa causa perda de pacotes, é provável que também ocorra qualquer outro fluxo de dados, incluindo os pacotes UDP.
O documento Características da perda de pacotes UDP: Efeito do tráfego TCP obteve seus resultados abrindo várias conexões TCP de uma só vez e inundando a rede com dados. Isso leva ao congestionamento seguido pela sincronização global , que causa a queda de pacotes. Obviamente, um cliente de jogo não abrirá uma dúzia de conexões de uma só vez e inundará a rede com dados e, portanto, seus resultados serão diferentes.
Para responder sua pergunta:
Gostaria de saber se faz sentido usar o TCP e o UDP ao mesmo tempo, mas para coisas diferentes [...]
Sim, isso é algo aceitável, desde que você permaneça dentro dos limites da largura de banda.
- TCP para o envio de informações enviadas com pouca frequência, mas com garantia de chegada confiável. Como atualizações de pontuação, o nome de um jogador ou até o estado on / off de uma luz no mundo do jogo.
Ao usar o TCP e o UDP, você sempre deve preferir enviar o máximo possível pelo UDP e o mínimo possível pelo TCP.
Agora, pergunto-lhe o seguinte: é realmente necessário enviar a pontuação, o nome do jogador e o estado da luz sobre o TCP? Embora seja verdade que você precise receber esses dados eventualmente, é verdade que você precisa receber esses dados estritamente em ordem e exatamente uma vez?
Provavelmente não.
O UDP funciona bem nesses casos, e o Quake 3 é um bom exemplo de como.
Então, qual é um bom exemplo de TCP ao lado de UDP? Bem, pense na caixa de bate-papo de um jogo. As atualizações nesta caixa de bate-papo (ou seja, as novas linhas de texto) precisam ser enviadas de maneira confiável e estritamente em ordem. Assim, o TCP é um bom ajuste.