Para troca geral de mensagens de protocolo, que pode tolerar alguma perda de pacotes. Quão mais eficiente é o UDP sobre TCP?
Para troca geral de mensagens de protocolo, que pode tolerar alguma perda de pacotes. Quão mais eficiente é o UDP sobre TCP?
Respostas:
O UDP é mais rápido que o TCP e o motivo simples é que seu ACK (pacote de reconhecimento inexistente) permite um fluxo contínuo de pacotes, em vez do TCP que reconhece um conjunto de pacotes, calculado usando o tamanho da janela TCP e o tempo de viagem de ida e volta (RTT).
Para obter mais informações, recomendo a explicação simples, mas muito compreensível do Skullbox (TCP vs. UDP)
As pessoas dizem que a principal coisa que o TCP oferece é a confiabilidade. Mas isso não é verdade. A coisa mais importante que o TCP oferece é o controle de congestionamento: você pode executar 100 conexões TCP em um link DSL, todas na velocidade máxima, e todas as 100 conexões serão produtivas, porque todas "detectam" a largura de banda disponível. Experimente isso com 100 aplicativos UDP diferentes, todos os pacotes com a maior rapidez possível e veja como as coisas funcionam bem para você.
Em uma escala maior, esse comportamento TCP é o que impede a Internet de travar no "colapso do congestionamento".
Coisas que tendem a empurrar aplicativos para o UDP:
Semântica de entrega em grupo: é possível fazer entrega confiável para um grupo de pessoas com muito mais eficiência do que o reconhecimento ponto a ponto da TCP.
Entrega fora de ordem: em muitos aplicativos, desde que você obtenha todos os dados, você não se importa com a ordem em que eles chegam; você pode reduzir a latência no nível do aplicativo aceitando um bloco fora de ordem.
Não amigável: em uma festa na LAN, você pode não se importar se o seu navegador da web funciona bem desde que você esteja atualizando as atualizações da rede o mais rápido possível.
Mas mesmo se você se preocupa com o desempenho, provavelmente não deseja usar o UDP:
Você está pronto para a confiabilidade agora, e muitas das coisas que você pode fazer para implementar a confiabilidade podem acabar sendo mais lentas do que o TCP já faz.
Agora você não é amigável à rede, o que pode causar problemas em ambientes compartilhados.
Mais importante ainda, os firewalls o bloquearão.
Você pode potencialmente superar alguns problemas de desempenho e latência de TCP "entroncando" várias conexões TCP juntas; O iSCSI faz isso para contornar o controle de congestionamento nas redes locais, mas você também pode criar um canal de mensagem "urgente" de baixa latência (o comportamento "URGENTE" do TCP é totalmente interrompido).
listen
-> accept
-> o estado do cliente é naturalmente independente de outros clientes). O tratamento de várias conexões de um único cliente, em particular, torna-se complicado com o UDP. E um ponto a favor do UDP é que as pilhas de UDP são realmente fáceis de implementar, o que é uma enorme vantagem em sistemas embarcados (microcontroladores, FPGAs etc.). Em particular, uma implementação de TCP para um FPGA é geralmente algo que você deseja comprar de outra pessoa. e não pensar).
Em alguns aplicativos, o TCP é mais rápido (melhor taxa de transferência) que o UDP.
Este é o caso de muitas gravações pequenas em relação ao tamanho da MTU. Por exemplo, li um experimento em que um fluxo de pacotes de 300 bytes estava sendo enviado por Ethernet (1500 bytes MTU) e o TCP era 50% mais rápido que o UDP .
O motivo é que o TCP tentará armazenar em buffer os dados e preencher um segmento de rede completo, tornando mais eficiente o uso da largura de banda disponível.
O UDP, por outro lado, coloca o pacote no fio imediatamente, congestionando a rede com muitos pacotes pequenos.
Você provavelmente não deve usar o UDP, a menos que tenha um motivo muito específico para fazê-lo. Especialmente porque você pode fornecer ao TCP o mesmo tipo de latência que o UDP desativando o algoritmo Nagle (por exemplo, se você estiver transmitindo dados do sensor em tempo real e não estiver preocupado em congestionar a rede com muitos pacotes pequenos).
com tolerante a perdas
Você quer dizer "com tolerância a perdas"?
Basicamente, o UDP não é "tolerante a perdas". Você pode enviar 100 pacotes para alguém, e eles podem receber apenas 95 desses pacotes e alguns podem estar na ordem errada.
Para coisas como streaming de vídeo e jogos com vários jogadores, onde é melhor perder um pacote do que atrasar todos os outros pacotes por trás dele, esta é a escolha óbvia
Para a maioria das outras coisas, porém, um pacote ausente ou "reorganizado" é crítico. Você teria que escrever um código extra para executar no UDP para tentar novamente se as coisas falhassem e impor a ordem correta. Isso adicionaria um pouco de sobrecarga em determinados lugares.
Felizmente, algumas pessoas muito, muito inteligentes, fizeram isso e chamaram de TCP.
Pense da seguinte maneira: se um pacote desaparecer, você gostaria de obter o próximo pacote o mais rápido possível e continuar (use UDP), ou você realmente precisa desses dados ausentes (use TCP). A sobrecarga não importará, a menos que você esteja em um cenário realmente crítico.
Qual protocolo tem melhor desempenho (em termos de taxa de transferência) - UDP ou TCP - depende realmente das características da rede e do tráfego da rede. Robert S. Barnes, por exemplo, aponta um cenário em que o TCP tem melhor desempenho (gravações de tamanho pequeno). Agora, considere um cenário em que a rede está congestionada e possui tráfego TCP e UDP. Os remetentes na rede que estão usando o TCP sentirão o 'congestionamento' e reduzirão suas taxas de envio. No entanto, o UDP não possui mecanismos de controle ou prevenção de congestionamentos, e os remetentes que usam o UDP continuariam a enviar dados na mesma taxa. Gradualmente, os remetentes TCP reduziriam suas taxas de envio ao mínimo e, se os remetentes UDP tiverem dados suficientes para serem enviados pela rede, eles consumiriam a maior parte da largura de banda disponível. Então, nesse caso, Os remetentes UDP terão maior taxa de transferência, à medida que obtiverem a maior fatia da largura de banda da rede. De fato, este é um tópico de pesquisa ativo - Como melhorar a taxa de transferência TCP na presença de tráfego UDP. Uma maneira, pelo que sei, usar quais aplicativos TCP podem melhorar a taxa de transferência é abrir várias conexões TCP. Dessa forma, mesmo que a taxa de transferência de cada conexão TCP possa ser limitada, a soma total da taxa de transferência de todas as conexões TCP pode ser maior que a taxa de transferência de um aplicativo usando UDP.
Quando se fala em "o que é mais rápido" - há pelo menos dois aspectos muito diferentes: taxa de transferência e latência.
Se falar sobre taxa de transferência - o controle de fluxo do TCP (como mencionado em outras respostas), é extremamente importante e fazer algo comparável ao UDP, embora certamente possível, seria uma grande dor de cabeça (tm). Como resultado - usando UDP quando você precisar de taxa de transferência , raramente se qualifica como uma boa idéia (a menos que você queira obter uma vantagem injusta sobre o TCP).
No entanto, se falar de latências - tudo é completamente diferente. Enquanto na ausência de perda de pacotes, o TCP e o UDP se comportam extremamente semelhantes (quaisquer diferenças, se houver, são marginais) - após a perda do pacote, todo o padrão muda drasticamente.
Após qualquer perda de pacote, o TCP aguardará a retransmissão por pelo menos 200ms (1seg pelo parágrafo 2.4 da RFC6298, mas implementações práticas práticas tendem a reduzi-la para 200ms). Além disso, com o TCP, mesmo os pacotes que chegaram ao host de destino - não serão entregues ao seu aplicativo até que o pacote ausente seja recebido (ou seja, toda a comunicação é atrasada em ~ 200ms) - BTW, esse efeito, conhecido como Head-of O bloqueio de linha é inerente a todos os fluxos ordenados confiáveis, seja TCP ou UDP confiável + ordenado. Para piorar ainda mais as coisas - se o pacote retransmitido também for perdido, falaremos sobre um atraso de ~ 600ms (devido ao chamado backoff exponencial, a primeira retransmissão é 200ms e a segunda é 200 * 2 = 400ms). Se nosso canal tiver 1% de perda de pacotes (o que não é ruim para os padrões atuais), e temos um jogo com 20 atualizações por segundo - esses atrasos de 600ms ocorrerão em média a cada 8 minutos. E como 600ms é mais que suficiente para você ser morto em um jogo em ritmo acelerado - bem, é muito ruim para a jogabilidade. Esses efeitos são exatamente o motivo pelo qual gamedevs prefere UDP sobre TCP.
No entanto, ao usar o UDP para reduzir latências - é importante perceber que apenas "usar o UDP" não é suficiente para obter uma melhoria substancial da latência, é tudo sobre COMO você está usando o UDP. Em particular, embora as bibliotecas RUDP geralmente evitem esse "recuo exponencial" e usem tempos de retransmissão mais curtos - se forem usados como um fluxo "ordenado confiável", eles ainda terão que sofrer bloqueio de cabeçalho de linha (por isso, no caso de um duplo perda de pacotes, em vez dos 600ms, obteremos 1,5 * 2 * RTT - ou, para um bom RT de 80ms, é um atraso de ~ 250ms, o que é uma melhoria, mas ainda é possível fazer melhor). Por outro lado, se estiver usando as técnicas discutidas em http://gafferongames.com/networked-physics/snapshot-compression/ e / ou http: // ithare. , é possível eliminar completamente o bloqueio do cabeçalho de linha (para uma perda de pacotes duplos para um jogo com 20 atualizações / segundo, o atraso será de 100 ms, independentemente do RTT).
E como uma observação lateral - se você tiver acesso apenas ao TCP, mas não ao UDP (como no navegador ou se o seu cliente estiver atrás de um dos 6 a 9% dos firewalls feios que bloqueiam o UDP) - parece haver uma maneira de implementar UDP-over-TCP sem gerar muitas latências, veja aqui: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (certifique-se de ler os comentários também (!)).
Cada conexão TCP requer um handshake inicial antes da transmissão dos dados. Além disso, o cabeçalho TCP contém muita sobrecarga destinada a diferentes sinais e detecção de entrega de mensagens. Para uma troca de mensagens, o UDP provavelmente será suficiente se uma pequena chance de falha for aceitável. Se o recebimento precisar ser verificado, o TCP é sua melhor opção.
@Andrew , eu imploro para diferir. O UDP é a escolha em alguns tipos de aplicativos devido a requisitos de desempenho. Um exemplo clássico é a videoconferência. Esse tipo de aplicativo não responde bem ao controle TCP.
Outro aspecto a considerar é se você precisará de multicast. Se sim, use UDP.
Vou apenas esclarecer as coisas. TCP / UDP são dois carros que estão sendo conduzidos na estrada. suponha que os sinais e obstáculos de tráfego sejam Erros O TCP cuida de sinais de trânsito e respeita tudo ao seu redor. Condução lenta, porque algo pode acontecer com o carro. Enquanto o UDP apenas desliga, a toda velocidade não respeita as placas de rua. Nada, um motorista louco. O UDP não possui recuperação de erro. Se houver um obstáculo, ele apenas colidirá com ele e continuará. Enquanto o TCP garante que todos os pacotes sejam enviados e recebidos perfeitamente, sem erros, o carro simplesmente passa por obstáculos sem colidir. Espero que este seja um bom exemplo para você entender, por que o UDP é preferido nos jogos? Jogos precisam de velocidade. TCP é preferido em downloads ou os arquivos baixados podem estar corrompidos.
O UDP é um pouco mais rápido na minha experiência, mas não muito. A escolha não deve ser feita no desempenho, mas no conteúdo da mensagem e nas técnicas de compactação.
Se for um protocolo com troca de mensagens , sugiro que o desempenho muito leve que você recebe com o TCP valha a pena. Você tem uma conexão entre dois pontos finais que fornecerão tudo o que você precisa. Não tente fabricar seu próprio protocolo bidirecional confiável sobre o UDP, a menos que você esteja realmente confiante no que está realizando.
Lembre-se de que o TCP geralmente mantém várias mensagens ligadas. Se você deseja implementar isso no UDP, terá muito trabalho se quiser fazê-lo de maneira confiável. Sua solução será menos confiável, menos rápida ou uma quantidade incrível de trabalho. Existem aplicativos válidos do UDP, mas se você está fazendo essa pergunta, provavelmente a sua não é.
Houve algum trabalho feito para permitir que o programador tenha os benefícios dos dois mundos.
SCTP
É um protolol da camada de transporte independente, mas pode ser usado como uma biblioteca que fornece camada adicional sobre o UDP. A unidade básica de comunicação é uma mensagem (mapeada para um ou mais pacotes UDP). Há um controle de congestionamento embutido. O protocolo possui botões e ajustes para ativar
se algo disso for necessário para o seu aplicativo em particular.
Um problema é que o estabelecimento da conexão é um processo complicado (e, portanto, lento)
Outras coisas semelhantes
Mais uma coisa experimental proprietária semelhante
Isso também tenta melhorar o aperto de mão triplo do TCP e alterar o controle de congestionamento para lidar melhor com linhas rápidas.
Não faz sentido falar sobre TCP ou UDP sem levar em consideração a condição da rede. Se a rede entre os dois pontos tiver uma qualidade muito alta, o UDP é absolutamente mais rápido que o TCP, mas em outros casos, como a rede GPRS, o TCP poderá ser mais rápido e mais confiável que o UDP.
A configuração da rede é crucial para qualquer medida. Faz uma enorme diferença se você estiver se comunicando através de soquetes em sua máquina local ou com o outro lado do mundo.
Quero acrescentar três coisas à discussão: