Por que é UDP + um sistema de encomendas confiável software mais rápido do TCP?

StackOverflow https://stackoverflow.com/questions/1200901

  •  05-07-2019
  •  | 
  •  

Pergunta

Alguns jogos usam hoje um sistema de rede que as mensagens transmite sobre UDP, e assegura que as mensagens são confiáveis ??e ordenados.

Por exemplo, RakNet é um motor de jogo de rede popular. Ele usa apenas UDP para suas conexões, e tem todo um sistema para garantir que os pacotes podem ser confiável e ordenada, se assim escolherem.

A minha pergunta básica é: o que há com isso? TCP não é a mesma coisa que ordenou, UDP confiável? O que o torna muito mais lento do que as pessoas têm de reinventar basicamente a roda?

Foi útil?

Solução

Geral / Especialização

  1. O TCP é um sistema confiável de uso geral
  2. UDP + tudo o que é um sistema confiável de propósito específico.

coisas especializados são geralmente melhor do que as coisas de propósito geral para a coisa que eles são especializados.

Stream / Mensagem

  1. TCP é baseada em fluxo
  2. UDP é baseada em mensagens

O envio de informações de jogos discreta mapas geralmente melhor para um paradigma baseado em mensagens. Enviá-lo através de um fluxo é possível, mas terrivelmente ineficaz. Se você quiser enviar de forma confiável uma enorme quantidade de dados (transferência de arquivos), TCP é bastante eficaz. É por isso que o uso Bit-torrent UDP para mensagens de controle e TCP para o envio de dados.

Outras dicas

Nós mudado de confiança para não confiável na "League of Legends" cerca de um ano atrás por causa de diversas vantagens que desde então provou ser verdadeira:

1) informações Antigo torna-se irrelevante. Se eu enviar um pacote de saúde e não chegar ... Eu não quero ter que esperar por esse mesmo pacote de saúde para reenviar quando eu sei que é alterado.

2) Order às vezes não é necessário. Se eu estou enviando mensagens diferentes para diferentes sistemas pode não ser necessário para obter essas mensagens em ordem. Eu não forçar o cliente a esperar por mensagens em ordem.

3) não confiável não obter backup com mensagens ... ou seja, à espera de confirmações que significa que você pode resolver picos de perda de muito mais rapidamente.

4) Você pode controlar reenvios quando necessariamente de forma mais eficiente. Tais como reembalagem algo que não enviou em outro pacote. (TCP faz repack mas você pode fazê-lo de forma mais eficiente com o conhecimento sobre como funciona o seu programa.)

5) O controle de fluxo de mensagem, como jogando fora mensagens que são menos relevantes quando a rede de repente picos. O sistema de rede pode optar por não reenviar mensagens menos relevantes quando se tem uma perda de pico. Com TCP você ainda tem uma fila de mensagens que estão a tentar reenviar o que pode ser mais baixa prioridade.

6) Menor pacote cabeçalho ... realmente não precisa dizer muito sobre isso.

Há muito mais de uma diferença entre UDP e TCP que apenas confiabilidade e sequenciamento:

No coração da questão é o fato de que UDP é sem conexão , enquanto TCP é conectado . Esta simples leads diferença para uma série de outras diferenças que eu não vou ser capaz de reasonbly resumir aqui. Você pode ler a análise abaixo para obter mais detalhes.

TCP - UDP Análise Comparativa

A resposta em na minha opinião as duas palavras:. "Controle de congestionamento"

TCP vai para grandes comprimentos para gerenciar a largura de banda do caminho - para usar mais do mesmo, mas para garantir que há espaço para outras aplicações. Esta é uma tarefa muito difícil, e inerentemente não é possível a utilização de 100% da largura de banda de 100% do tempo.

Com UDP, por outro lado, pode-se fazer seu próprio protocolo para enviar os pacotes para o fio tão rápido quanto eles querem - o que torna o protocolo muito hostil para outras aplicações, mas pode ganhar mais "performance" de curto prazo . Por outro lado, é com grande probabilidade de que se as condições são apropriadas, este tipo de protocolos pode contribuir para congestionamento colapso .

O TCP é um protocolo orientado a stream, enquanto que o UDP é um protocolo orientado a mensagem. Daí TCP faz mais do que apenas confiabilidade e ordenação. Consulte este post para mais detalhes. Basicamente, os desenvolvedores RakNet adicionado a confiabilidade e ordenação, ainda mantendo-o como um protocolo orientado a mensagem, e por isso o resultado foi mais leve do que o TCP (que tem a ver mais).

Este pequeno artigo é antiga, mas ainda é muito verdadeiro quando se trata de jogos. Ele explica os dois protocolos, e os estragos essas pessoas fui tentando desenvolver um jogo internet multiplayer. "X-Wing vs Tie Fighter"

Lições Aprendidas (A Internet suga)

Há uma ressalva a esta, porém, eu executar / desenvolver um jogo multiplayer, e eu usei tanto. UDP foi muito melhor para meu aplicativo, mas um monte de gente não podia brincar com UDP. Routers e tal bloqueado as conexões. Então eu mudei para o TCP "confiável". Bem ... confiável? Acho que não. Você enviar um pacote, sem erros, você enviar outro e ele trava (exceção) no meio do pacote. Agora que os pacotes fez isso? Então você acaba escrevendo um protocolo confiável no topo do TCP, para simular UDP - mas continuamente estabelecer uma nova conexão quando ele trava. Tome sobre ineficiente.

UDP + Parar e esperar ARW = boa

UDP + protocolo de janela deslizante = melhor

TCP + protocolo de janela deslizante com reconexão? = Bulkware inútil. (IMHO)

O outro efeito colateral é aplicações multi-threaded. TCP funciona bem para um tipo de coisa sala de chat, uma vez que cada quarto pode ser o seu próprio fio. Uma sala pode conter 60-100 pessoas e ele funciona muito bem, como o fio sala contém os soquetes para cada participante.

UDP, por outro lado é melhor servido (IMO) por um fio, mas quando você começa o pacote, você tem que analisá-lo para descobrir o que ele veio (via informações enviadas ou RemoteEndPoint), em seguida, passar os dados para o fio de sala de chat de um modo multitarefa.

Na verdade, você tem que fazer o mesmo com TCP, mas apenas em conexão.

último ponto. Lembre-se de que o TCP só vai erro fora e matar a conexão a qualquer momento, mas você pode se reconectar em cerca de .5 segundos e enviar a mesma informação. A coisa mais bizarra que eu já trabalhei.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top