Como o TCP garante a entrega de pacotes e, portanto, pode ser considerado "confiável", enquanto o UDP não garante nada e os pacotes podem ser perdidos. Qual seria a vantagem de transmitir dados usando UDP em um aplicativo em vez de através de um fluxo TCP? Em que tipo de situações a UDP seria a melhor escolha e por quê?
Suponho que o UDP seja mais rápido, pois não tem a sobrecarga de criar e manter um fluxo, mas isso não seria irrelevante se alguns dados nunca chegarem ao seu destino?
networking
tcp
udp
Jeff L
fonte
fonte
Respostas:
Essa é uma das minhas perguntas favoritas. UDP é tão incompreendido.
Nas situações em que você realmente deseja obter uma resposta simples para outro servidor rapidamente, o UDP funciona melhor. Em geral, você deseja que a resposta esteja em um pacote de resposta e está preparado para implementar seu próprio protocolo para obter confiabilidade ou reenviar. DNS é a descrição perfeita desse caso de uso. Os custos das configurações de conexão são muito altos (no entanto, o DNS também suporta o modo TCP).
Outro caso é quando você está entregando dados que podem ser perdidos porque os dados mais recentes que chegam substituirão esses dados / estado anteriores. Dados climáticos, streaming de vídeo, um serviço de cotação de ações (não usado para negociação real) ou dados de jogos vêm à mente.
Outro caso é quando você está gerenciando uma quantidade enorme de estado e deseja evitar o uso do TCP porque o sistema operacional não pode lidar com tantas sessões. Este é um caso raro hoje. De fato, agora existem pilhas TCP de origem do usuário que podem ser usadas para que o gravador de aplicativos possa ter um controle mais refinado dos recursos necessários para esse estado TCP. Antes de 2003, o UDP era realmente o único jogo na cidade.
Um outro caso é para tráfego multicast. O UDP pode ser multicast para vários hosts, enquanto o TCP não pode fazer isso.
fonte
Se um pacote TCP for perdido, ele será reenviado. Isso não é útil para aplicativos que dependem de dados sendo manipulados em uma ordem específica em tempo real.
Os exemplos incluem streaming de vídeo e especialmente VoIP (por exemplo, Skype ). Nesses casos, no entanto, um pacote descartado não é tão importante: nossos sentidos não são perfeitos, por isso nem percebemos. É por isso que esses tipos de aplicativos usam UDP em vez de TCP.
fonte
A "falta de confiabilidade" da UDP é um formalismo. A transmissão não é absolutamente garantida. Por uma questão prática, eles quase sempre passam. Eles simplesmente não são reconhecidos e tentados novamente após um tempo limite.
A sobrecarga na negociação de um soquete TCP e no handshake dos pacotes TCP é enorme. Realmente enorme. Não há sobrecarga UDP apreciável.
Mais importante, você pode complementar facilmente o UDP com um aperto de mão de entrega confiável, que é menos sobrecarga que o TCP. Leia isto: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol
O UDP é útil para transmitir informações em um aplicativo de publicação / assinatura. IIRC, TIBCO faz uso pesado de UDP para notificação de mudança de estado.
Qualquer outro tipo de atividade unidirecional de "evento significativo" ou "registro" pode ser bem tratada com pacotes UDP. Você deseja enviar uma notificação sem construir um soquete inteiro. Você não espera nenhuma resposta dos vários ouvintes.
As mensagens de "batimento cardíaco" ou "estou vivo" do sistema também são uma boa opção. Faltar um não é uma crise. Faltam meia dúzia (seguidas).
fonte
Trabalho em um produto que suporta comunicação UDP (IP) e TCP / IP entre cliente e servidor. Tudo começou com o IPX há mais de 15 anos, com o suporte a IP adicionado há 13 anos. Adicionamos o suporte TCP / IP há 3 ou 4 anos. Um palpite: O índice de UDP para TCP é provavelmente de 80/20. O produto é um servidor de banco de dados, portanto, a confiabilidade é crítica. Temos que lidar com todos os problemas impostos pelo UDP (perda de pacotes, duplicação de pacotes, ordem de pacotes etc.) já mencionados em outras respostas. Raramente existem problemas, mas às vezes ocorrem e devem ser tratados. O benefício de oferecer suporte ao UDP é que podemos personalizá-lo um pouco para nosso próprio uso e ajustar um pouco mais de desempenho.
Toda rede será diferente, mas o protocolo de comunicação UDP geralmente é um pouco mais rápido para nós. O leitor cético questionará corretamente se implementamos tudo corretamente. Além disso, o que você pode esperar de um cara com um representante de 2 dígitos? No entanto, acabei de fazer um teste por curiosidade. O teste leu 1 milhão de registros (selecione * a partir de uma tabela). Defino o número de registros a retornar com cada solicitação de cliente individual como 1, 10 e 100 (três execuções de teste com cada protocolo). O servidor estava a apenas dois saltos em uma LAN de 100Mbit. Os números pareciam concordar com o que outros encontraram no passado (o UDP é cerca de 5% mais rápido na maioria das situações). Os tempos totais em milissegundos foram os seguintes para este teste específico:
A quantidade total de dados transmitidos foi praticamente a mesma para IP e TCP. Temos uma sobrecarga extra nas comunicações UDP, porque temos algumas das mesmas coisas que você obtém "gratuitamente" com o TCP / IP (somas de verificação, números de sequência etc.). Por exemplo, o Wireshark mostrou que uma solicitação para o próximo conjunto de registros era de 80 bytes com UDP e 84 bytes com TCP.
fonte
Já existem muitas boas respostas aqui, mas gostaria de acrescentar um fator muito importante, além de um resumo. O UDP pode alcançar uma taxa de transferência muito maior com o ajuste correto, porque não emprega controle de congestionamento . O controle de congestionamento no TCP é muito, muitoimportante. Ele controla a taxa e a taxa de transferência da conexão, a fim de minimizar o congestionamento da rede, tentando estimar a capacidade atual da conexão. Mesmo quando os pacotes são enviados por links muito confiáveis, como na rede principal, os roteadores possuem buffers de tamanho limitado. Esses buffers preenchem sua capacidade e os pacotes são descartados, e o TCP percebe essa queda pela falta de uma confirmação recebida, limitando a velocidade da conexão à estimativa da capacidade. O TCP também emprega algo chamado início lento , mas a taxa de transferência (na verdade, a janela de congestionamento) é aumentado lentamente até que os pacotes sejam descartados e, em seguida, diminuído e aumentado lentamente novamente até que os pacotes sejam descartados etc. Isso faz com que a taxa de transferência TCP flutue. Você pode ver isso claramente ao baixar um arquivo grande.
Como o UDP não está usando o controle de congestionamento, pode ser mais rápido e sofrer menos atraso, porque não procurará maximizar os buffers até o ponto de queda, ou seja, pacotes UDP estão gastando menos tempo nos buffers e chegam mais rápido com menos atraso. Como o UDP não emprega controle de congestionamento, mas o TCP, ele pode tirar a capacidade do TCP que gera fluxos UDP.
No entanto, o UDP ainda é vulnerável a congestionamentos e quedas de pacotes; portanto, seu aplicativo precisa estar preparado para lidar com essas complicações de alguma forma, provavelmente usando retransmissão ou códigos de correção de erros.
O resultado é que o UDP pode:
Em resumo, o UDP pode ser usado para todos os tipos de aplicativos que o TCP pode, desde que você também implemente um mecanismo de retransmissão adequado. O UDP pode ser muito rápido, tem menos atraso, não é afetado pelo congestionamento com base na conexão, transmite datagramas de tamanho fixo e pode ser usado para multicast.
fonte
O UDP tem menos sobrecarga e é bom para fazer coisas como transmitir dados em tempo real, como áudio ou vídeo, ou, em qualquer caso, onde estiver correto se os dados forem perdidos.
fonte
O UDP é um protocolo sem conexão e é usado em protocolos como SNMP e DNS nos quais os pacotes de dados que chegam fora de ordem são aceitáveis e a transmissão imediata do pacote de dados é importante.
É usado no SNMP, pois o gerenciamento de rede geralmente deve ser feito quando a rede está estressada, ou seja, quando é difícil obter uma transferência de dados confiável e controlada por congestionamento.
É usado no DNS, pois não envolve o estabelecimento da conexão, evitando atrasos no estabelecimento da conexão.
Felicidades
fonte
Uma das melhores respostas que conheço para essa pergunta vem do usuário zAy0LfpBZLC8mAC no Hacker News . Esta resposta é tão boa que vou citá-la como está.
fonte
O streaming de vídeo é um exemplo perfeito do uso de UDP.
fonte
O UDP tem uma sobrecarga mais baixa, como já foi dito, é bom para transmitir coisas como vídeo e áudio, onde é melhor perder um pacote e tentar reenviar e recuperar o atraso.
Não há garantias na entrega do TCP, você simplesmente deve saber se o soquete desconectou ou basicamente se os dados não chegarão. Caso contrário, ele chega lá quando chega lá.
Uma coisa importante que as pessoas esquecem é que o udp é baseado em pacotes e o tcp é baseado em sonho, não há garantia de que o "pacote tcp" que você enviou seja o pacote que aparece na outra extremidade; ele pode ser dissecado em tantos pacotes como os roteadores e as pilhas desejam. Portanto, seu software tem a sobrecarga adicional de analisar bytes de volta em pedaços utilizáveis de dados, que podem levar uma quantidade razoável de sobrecarga. O UDP pode estar com problemas, então você precisa numerar seus pacotes ou usar outro mecanismo para reordená-los, se desejar fazê-lo. Mas se você receber esse pacote udp, ele chega com todos os mesmos bytes na mesma ordem em que saiu, sem alterações. Portanto, o termo pacote udp faz sentido, mas o pacote tcp não necessariamente. O TCP possui seu próprio mecanismo de re-tentativa e pedido oculto no seu aplicativo,
O UDP é muito mais fácil de escrever código nas duas extremidades, basicamente porque você não precisa fazer e manter as conexões ponto a ponto. Minha pergunta é geralmente onde estão as situações em que você deseja sobrecarga do TCP? E se você usar atalhos como assumir que um "pacote" tcp recebido é o pacote completo enviado, você está melhor? (é provável que você jogue fora dois pacotes se tentar verificar o tamanho / conteúdo)
fonte
A comunicação em rede para videogames é quase sempre feita por UDP.
A velocidade é de extrema importância e realmente não importa se as atualizações são perdidas, pois cada atualização contém o estado atual completo do que o player pode ver.
fonte
A questão principal estava relacionada a "que tipo de situações o UDP seria a melhor escolha [sobre tcp]"
Há muitas ótimas respostas acima, mas o que falta é qualquer avaliação formal e objetiva do impacto da incerteza de transporte no desempenho do TCP.
Com o crescimento maciço de aplicativos móveis e os paradigmas "ocasionalmente conectados" ou "ocasionalmente desconectados" que os acompanham, certamente existem situações em que a sobrecarga das tentativas do TCP de manter uma conexão quando as conexões são difíceis de obter leva a uma forte argumento para o UDP e sua natureza "orientada a mensagens".
Agora, não tenho matemática / pesquisa / números, mas produzi aplicativos que funcionaram de maneira mais confiável usando ACK / NAK e numeração de mensagens em UDP do que seria possível com o TCP quando a conectividade era geralmente ruim e o TCP antigo acabei de passar o tempo e o dinheiro do meu cliente apenas tentando se conectar. Você consegue isso em áreas regionais e rurais de muitos países ocidentais ....
fonte
Em alguns casos, que outros destacaram, a chegada garantida de pacotes não é importante e, portanto, o uso do UDP é bom. Há outros casos em que o UDP é preferível ao TCP.
Um caso único em que você deseja usar o UDP em vez do TCP é onde você está encapsulando o TCP em outro protocolo (por exemplo, túneis, redes virtuais etc.). Se você encapsular TCP sobre TCP, os controles de congestionamento de cada um interferirão entre si. Portanto, geralmente se prefere encapsular o TCP sobre o UDP (ou algum outro protocolo sem estado). Consulte o artigo TechRepublic: Noções básicas sobre TCP sobre TCP: efeitos do encapsulamento TCP na taxa de transferência de ponta a ponta e na latência .
fonte
O UDP pode ser usado quando um aplicativo se importa mais com dados "em tempo real", em vez da replicação exata dos dados. Por exemplo, o VOIP pode usar o UDP e o aplicativo se preocupará em solicitar novamente os pacotes, mas no final o VOIP não precisa de todos os pacotes, mas o mais importante é que precisa de um fluxo contínuo de muitos deles. Talvez você tenha uma "falha" na qualidade da voz, mas o objetivo principal é que você receba a mensagem e não que ela seja recriada perfeitamente do outro lado. O UDP também é usado em situações em que as despesas de criação de uma conexão e sincronização com o TCP superam a carga útil. As consultas DNS são um exemplo perfeito. Um pacote fora, um pacote de volta, por consulta. Se usar o TCP, isso seria muito mais intenso. Se você não receber a resposta do DNS de volta, tente novamente.
fonte
UDP quando a velocidade for necessária e a precisão se os pacotes não forem, e TCP quando você precisar de precisão.
O UDP geralmente é mais difícil, pois você deve escrever seu programa de forma que não dependa da precisão dos pacotes.
fonte
Nem sempre é claro. No entanto, se você precisar de entrega garantida de pacotes sem perda e na sequência correta, provavelmente o TCP será o que você deseja.
Por outro lado, o UDP é apropriado para transmitir pacotes curtos de informações em que a sequência das informações é menos importante ou onde os dados podem caber em um único pacote.
Também é apropriado quando você deseja transmitir as mesmas informações para muitos usuários.
Outras vezes, é apropriado quando você está enviando dados sequenciados, mas se algum deles desaparecer, você não está muito preocupado (por exemplo, um aplicativo VOIP).
Alguns protocolos são mais complexos porque o necessário são alguns (mas não todos) dos recursos do TCP, mas mais do que o UDP fornece. É aí que a camada de aplicativo deve implementar a funcionalidade adicional. Nesses casos, o UDP também é apropriado (por exemplo, rádio na Internet, a ordem é importante, mas nem todos os pacotes precisam passar).
Exemplos de onde é / poderia ser usado 1) Um servidor de horário transmitindo o horário correto para várias máquinas em uma LAN. 2) protocolos VOIP 3) pesquisas de DNS 4) Solicitando serviços de LAN, por exemplo, onde você está? 5) rádio na Internet 6) e muitos outros ...
No unix, você pode digitar grep udp / etc / services para obter uma lista dos protocolos UDP implementados hoje ... existem centenas.
fonte
Veja a seção 22.4 da Programação de rede Unix de Steven , "Quando usar o UDP em vez do TCP".
Além disso, consulte esta outra resposta do SO sobre o equívoco de que o UDP é sempre mais rápido que o TCP .
O que Steven diz pode ser resumido da seguinte forma:
fonte
Sabemos que o UDP é um protocolo sem conexão, por isso é
Exemplos específicos:
fonte
Comparando o TCP ao UDP, protocolos sem conexão como o UDP garantem velocidade, mas não a confiabilidade da transmissão de pacotes. Por exemplo, em videogames geralmente não precisa de uma rede confiável, mas a velocidade é a mais importante e o uso do UDP para jogos tem a vantagem de reduzir o atraso na rede.
fonte
Você deseja usar o UDP sobre TCP nos casos em que a perda de alguns dados ao longo do caminho não estrague completamente os dados que estão sendo transmitidos. Muitos de seus usos são em aplicativos em tempo real, como jogos (por exemplo, FPS, onde você nem sempre precisa saber onde estão todos os jogadores em um determinado momento) e se você perder alguns pacotes ao longo do caminho, novos os dados informam corretamente onde estão os players) e o streaming de vídeo em tempo real (um quadro corrompido não estraga a experiência de visualização).
fonte
Temos serviço web com milhares de clientes winforms em tantos PCs. Os PCs não têm conexão com o back-end do banco de dados, todo o acesso é via serviço da web. Por isso, decidimos desenvolver um servidor de log central que escuta em uma porta UDP e todos os clientes enviam um pacote de log de erros xml (usando o log4net UDP appender) que é despejado em uma tabela de banco de dados após o recebimento. Como não nos importamos realmente com a falta de alguns logs de erros e com milhares de clientes, é rápido com um serviço de registro dedicado que não carrega o serviço da Web principal.
fonte
Estou um pouco relutante em sugerir UDP quando o TCP poderia funcionar. O problema é que, se o TCP não estiver funcionando por algum motivo, porque a conexão está muito atrasada ou congestionada, é improvável que a alteração do aplicativo para usar o UDP. Uma conexão ruim também é ruim para o UDP. O TCP já faz um excelente trabalho para minimizar o congestionamento.
O único caso em que posso pensar onde o UDP é necessário é para protocolos de transmissão. Nos casos em que um aplicativo envolve dois hosts conhecidos, o UDP provavelmente oferecerá apenas benefícios marginais de desempenho por custos substancialmente maiores da complexidade do código.
fonte
Use o UDP apenas se você realmente souber o que está fazendo. Atualmente, o UDP está em casos extremamente raros, mas o número de especialistas (mesmo muito experientes) que tentariam colocá-lo em qualquer lugar parece desproporcional. Talvez eles gostem de implementar o código de tratamento de erros e manutenção de conexão.
Espera-se que o TCP seja muito mais rápido com as placas de interface de rede modernas, devido ao que é conhecido como impressão de soma de verificação . Surpreendentemente, em altas velocidades de conexão (como 1 Gbps), o cálculo de uma soma de verificação seria uma grande carga para uma CPU, por isso é transferida para o hardware da NIC que reconhece os pacotes TCP para impressão e não oferece o mesmo serviço.
fonte
O UDP é perfeito para endereços VoIP nos quais o pacote de dados deve ser enviado, considerando menos sua confiabilidade ... O bate-papo por vídeo é um exemplo de UDP (você pode verificá-lo através da captura de rede wireshark durante qualquer bate-papo por vídeo). O TCP também não funciona com Protocolos DNS e SNMP. O UDP não possui sobrecarga, enquanto o TCP possui muita sobrecarga
fonte