Quando é apropriado usar o UDP em vez do TCP? [fechadas]

303

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?

Jeff L
fonte
55
Além de sofrer possível perda de pacotes, o UDP não garante que você receberá o pacote apenas uma vez. Se você tiver redes complicadas ou mal configuradas, poderá receber o mesmo pacote várias vezes. Apenas um alerta, já que as pessoas tendem a esquecer isso!
9139 Brian Agnew
3
Não garante nem a encomenda de pacotes.
Mehrdad Afshari 08/07/09
19
O TCP não garante a entrega , apenas garante que, se puder entregar os pacotes, eles estarão na mesma ordem em que foram enviados.
Chaim Geretz 10/03/11
5
BTW, frequentemente vejo pessoas equiparar confiabilidade / entrega em ordem a retransmissões TCP. Esses "especialistas" lhe dirão que, para superar os erros de transmissão no UDP, você reimplementará o TCP (mal) e, portanto, poderá usar o TCP. Isso não é verdade. Além de retransmitir, existem outras técnicas de recuperação de erros que não sofrem latência ou taxa de transferência exponencialmente degradada como resultado de taxas de erro pequenas, mas diferentes de zero.
Ben Voigt
O TCP também garante que você saberá se o destino não recebeu os pacotes.
precisa

Respostas:

354

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.

drudru
fonte
Obrigado pela resposta interessante. Atualmente, temos um servidor fazendo tudo em UDP (requisito de alta largura de banda), o que é aceitável porque existe realmente um único salto (roteamento desativado ...), mas notamos que a reordenação de pacotes pode se tornar um problema em algumas placas de rede com defeito. Qual pilha TCP do modo de usuário (ou algum outro fluxo controlado no modo de usuário) você sugere?
13283 dashesy #
@ dashesy - você pode se livrar da exigência de pedidos? Existe um número monotonicamente crescente dentro da carga útil que você pode usar? Nesse caso, você realmente não precisa de uma pilha TCP total do usuário.
drudru
@ drudru- sim, o número de sequência está lá, talvez eu precise me tampar e me afastar. Obrigado, eliminar mais uma opção é sempre excelente.
dashesy
64

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.

Stephan202
fonte
16
Eu acho que você tem ao contrário. O TCP reordena os pacotes para que os dados sejam entregues no pedido enviado. UDP não faz re-ordem e fornece dados em qualquer ordem que recebeu no.
Hans Malherbe
1
O UDP não garante o pedido, no entanto, você pode numerar os pacotes e reordená-los após recuperá-los.
Kugel
7
@ Stephan202: Eu acho que eu teria que discordar sobre não perceber os pacotes descartados em Skype ;-)
Robert S. Barnes
6
@ Kugel: Cuidado com o fato de você estar implementando uma nova pilha TCP. É improvável que você faça um trabalho melhor que o SO neste momento.
erikkallen
1
@erikkallen: Se alguém estivesse usando o UDP para implementar um protocolo de nível superior com os mesmos requisitos que o TCP foi projetado para atender, seria improvável que se saísse muito melhor do que os protocolos existentes. Por outro lado, alguns aplicativos se beneficiam da adição de alguns recursos ao protocolo com o qual um wrapper UDP pode lidar melhor do que o TCP.
Super dec
56

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).

S.Lott
fonte
5
"Por uma questão prática, eles quase sempre passam". Depende muito da menor confiabilidade das camadas de rede.
precisa
além disso, existe uma diferença entre o planejamento para "algumas" perdas de pacotes e "muita" perda de pacotes? perda é perda. você tem que planejar de qualquer maneira.
Sedat Kapanoglu 21/09/16
30

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:

  1. 1 registro
    • IP: 390.760 ms
    • TCP: 416.903 ms
  2. 10 registros
    • IP: 91.707 ms
    • TCP: 95.662 ms
  3. 100 registros
    • IP: 29.664 ms
    • TCP: 30.968 ms

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.

Mark Wilkins
fonte
E se você o tivesse desenvolvido apenas para TCP e comprasse hardware melhor em vez de 5x mais esforço de codificação?
Inf3rno 2/06
2
Obrigado pelos números concretos! A melhoria de 5% é um pouco decepcionante pela complexidade que ela adiciona.
Sergei
1
Provavelmente os 5% é porque é enviado em uma rede local (duas esperanças de distância)? Meu palpite é que quanto mais longe, maior a diferença.
Lepe
19

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:

  • Alcance uma taxa de transferência mais alta que o TCP, desde que a taxa de queda da rede esteja dentro dos limites que o aplicativo possa suportar.
  • Entregue pacotes mais rapidamente que o TCP com menos atraso.
  • Configure as conexões mais rapidamente, pois não há um handshake inicial para configurar a conexão
  • Transmitir pacotes multicast, enquanto o TCP precisa usar várias conexões.
  • Transmitir pacotes de tamanho fixo, enquanto o TCP transmite dados em segmentos. Se você transferir um pacote UDP de 300 bytes, receberá 300 bytes na outra extremidade. Com o TCP, você pode alimentar o soquete de envio de 300 bytes, mas o receptor lê apenas 100 bytes e você precisa descobrir de alguma forma que existem mais 200 bytes a caminho. Isso é importante se o seu aplicativo transmitir mensagens de tamanho fixo, em vez de um fluxo de bytes.

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.

Andy
fonte
1
Quando as redes ficam suficientemente congestionadas para causar perda de pacotes, o TCP tenta minimizar seu impacto sobre outros usuários da rede, enquanto muitas implementações baseadas em UDP não. Isso permite que eles obtenham uma parcela maior de uma torta decrescente, mas também reduz a quantidade total de período disponível de largura de banda útil (por exemplo, como consequência de retransmissão desnecessária nos casos em que os dados seriam realmente entregues, mas o remetente não perceberia isso)
supercat 08/07
Antes de tudo, obrigado pela ótima resposta, eu realmente aprendi muito com isso! Mas eu tenho uma pergunta: a segmentação não acontece na camada 3 (IP) devido às limitações do adaptador Ethernet para todos os pacotes recebidos da camada 4 (TCP e UDP)? Você quer dizer outro tipo de segmentação que ocorre no TCP, mas não no UDP? Eu realmente aprecio se você pudesse me explicar.
precisa saber é o seguinte
1
@Freezy. Você está certo, a fragmentação de pacotes que excedem o MTU do link (camada 2) acontece na camada 3-IP. No entanto, o TCP é um protocolo baseado em fluxo e trata os dados como um fluxo de bytes. O TCP envia seus dados em segmentos para caber dentro de pacotes IP, que são dimensionados de acordo com o MSS, para que a segmentação também ocorra no TCP. A quantidade de dados que o TCP coloca em um segmento ou a quantidade de dados que seu soquete lê varia por vários fatores; pode ter 1 byte ou bytes MSS. Com o UDP, o receptor sempre obtém o número exato de bytes que o transmissor enviou, se o pacote não for perdido no caminho.
Andy
15

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.

Dana Holt
fonte
15

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

Arnkrishn
fonte
12

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á.

O TCP possui bloqueio no cabeçalho da fila, pois garante entrega completa e em ordem; portanto, quando um pacote é perdido em trânsito, ele precisa aguardar uma retransmissão do pacote ausente, enquanto o UDP entrega pacotes ao aplicativo assim que chegam. , incluindo duplicatas e sem qualquer garantia de que um pacote chegue ou em que ordem eles chegam (na verdade é essencialmente IP com números de porta e uma soma de verificação de carga útil (opcional) adicionada), mas isso é bom para telefonia, por exemplo, onde normalmente simplesmente não importa quando faltam alguns milissegundos de áudio, mas o atraso é muito irritante, para que você não se incomode com retransmissões, basta soltar duplicatas e ordenar pacotes reordenados na ordem certa por algumas centenas de milissegundos de buffer de tremulação , e se os pacotes não aparecerem a tempo ou nada, eles são simplesmente ignorados,possível interpolado quando suportado pelo codec.

Além disso, uma parte importante do TCP é o controle de fluxo, para garantir que você obtenha o máximo de througput possível, mas sem sobrecarregar a rede (o que é meio redundante, pois uma rede sobrecarregada descarta seus pacotes, o que significa que você deve fazer retransmite, o que prejudica a produtividade), o UDP não possui nada disso - o que faz sentido para aplicativos como telefonia, pois a telefonia com um determinado codec precisa de uma certa quantidade de largura de banda, você não pode "desacelerar", e largura de banda adicional também não torna a chamada mais rápida.

Além dos aplicativos em tempo real / baixa latência, o UDP faz sentido para transações realmente pequenas, como pesquisas de DNS, simplesmente porque não possui o estabelecimento da conexão TCP e a sobrecarga de desmontagem, tanto em termos de latência quanto em termos de uso da largura de banda. Se sua solicitação for menor que uma MTU típica e a repsonse provavelmente também for, você poderá fazer isso em uma ida e volta, sem precisar manter nenhum estado no servidor, e o controle de fluxo também ordenará e tudo o que provavelmente não é particularmente útil para tais usos também.

E então, você pode usar o UDP para criar suas próprias substituições de TCP, é claro, mas provavelmente não é uma boa idéia sem uma compreensão profunda da dinâmica da rede, os algoritmos modernos de TCP são bastante sofisticados.

Além disso, acho que deve ser mencionado que há mais do que UDP e TCP, como SCTP e DCCP. O único problema atualmente é que a Internet (IPv4) está cheia de gateways NAT que impossibilitam o uso de protocolos diferentes de UDP e TCP em aplicativos de usuário final.

Shital Shah
fonte
Você pode executar o SCTP e o DCCP sobre o UDP.
Demi
9

O streaming de vídeo é um exemplo perfeito do uso de UDP.

Daniel A. White
fonte
Por favor, forneça alguns exemplos.
Gaurav Singh
"Video Streaming" é o exemplo. Considere uma transmissão ao vivo transmitida por hotstar.
Sisir 5/01
8

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)

old_timer
fonte
O TCP tem uma garantia de entrega: o pedaço A será entregue a um aplicativo antes do pedaço B, portanto, se um aplicativo reconhecer (no nível do aplicativo) o pedaço B, você sabe que recebeu o pedaço A. Mas isso também acontece no nível de manipulação do TCP.
Simeon Pilgrim
No TCP, é possível delimitar com segurança pedaços de dados simplesmente prefixando cada pedaço com seu comprimento. Dependendo do aplicativo, é possível prefixar cada pedaço com um comprimento fixo de um byte, dois ou quatro bytes ou um prefixo com tamanho de 128 ^ N ou menos com um comprimento de N-byte. Não é exatamente uma sobrecarga enorme. Esse design seria ruim com protocolos que não garantem a entrega em ordem sem falhas, mas ao usar o TCP, esse design é adequado.
Supercat
se à procura de comprimento fixo quantidades de dados que você não precisa mesmo o comprimento que você acabou de contar os bytes como eles vêm em ...
old_timer
1
@supercat. Você está absolutamente certo. Isso também significa que você está adicionando complexidade ao seu aplicativo; complexidade que é realmente necessária no UDP. Por esse motivo, o TCP é melhor para transferir fluxos, como arquivos. Mas faço exatamente o que você faz quando deseja confiabilidade dos dados em blocos e talvez segurança extra do TLS no TCP superior.
22415 Andy
5

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.

17 de 26
fonte
5
normal, não o estado completo, mas um delta desde o último reconhecimento; portanto, as atualizações ficam progressivamente maiores.
Simeon Pilgrim
5

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 ....

Rob Von Nesselrode
fonte
3

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 .

Brian M. Hunt
fonte
2

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.

RC.
fonte
2

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.

bgw
fonte
2

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.

Matt
fonte
2

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:

  • Use UDP para transmissão e multicast, pois essa é sua única opção (use multicast para novos aplicativos)
  • Você pode usar o UDP para aplicativos simples de solicitação / resposta, mas precisará criar suas próprias observações, tempos limite e retransmissões
  • Não use UDP para transferência de dados em massa.
Robert S. Barnes
fonte
1
Um pouco mais de informação sobre esse último ponto, para qualquer um que aparecer. O TCP funciona para transferência de dados em massa, mas se você não se importa que seus dados cheguem da ordem do início ao fim, você pode escrever um protocolo sobre UDP que pode ser mais rápido - muito mais rápido em casos patológicos muito específicos. Não é que você não possa fazer transferências em massa no UDP, mas não é sempre um desempenho pior; é tão difícil de implementar que raramente vale a pena.
Ijw
1
Sim, você pode usar o UDP para transferência em massa e precisa implementar seu próprio mecanismo de controle. Se é um pé no saco ou não, depende de suas habilidades de programação, mas definitivamente nem sempre é um desempenho pior. Você tem que saber o que está fazendo; se não o fizer, pode sofrer.
22415 Andy
2

Sabemos que o UDP é um protocolo sem conexão, por isso é

  1. adequado para processos que requerem comunicação simples de solicitação-resposta.
  2. adequado para processos com fluxo interno, controle de erros
  3. adequado para fundição ampla e multicasting

Exemplos específicos:

  • usado no SNMP
  • usado para alguns protocolos de atualização de rota, como RIP
Vikki
fonte
2

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.

insira a descrição da imagem aqui

Jorgesys
fonte
1

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).

Zachary Murray
fonte
Bem, um quadro corrompido vai arruinar essa parte da visualização, mas você não deseja que ele pare todos os últimos quadros, enquanto o espera, se os quadros posteriores tiverem mais valor do que o quadro perdido.
Simeon Pilgrim
1

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.

softveda
fonte
0

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.

SingleNegationElimination
fonte
Um aplicativo em que você obterá melhores resultados do UDP é através do teste de colocação, se um nó intermediário estiver executando o policiamento de tráfego, pois você pode controlar a taxa de pacotes com mais facilidade, verso TCP que empurrará os pacotes rapidamente e a interação do TCP a janela interage negativamente com o policiamento.
Simeon Pilgrim
Isso ainda é uma otimização, que deve seguir os testes reais. Meu argumento é que você ainda deve tentar usar o TCP primeiro e somente tentar alternativas quando descobrir que o TCP não está funcionando por algum motivo. Escolher o UDP porque teoricamente suporta um melhor uso da largura de banda é uma forma de otimização prematura.
SingleNegationElimination
Oh, concorde com a frente da otimização. Mas o conhecimento de quando o TCP pode ser o problema, em vez de outra coisa, ajuda quando você tenta resolver esse problema de desempenho.
Simeon Pilgrim
-1

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.

Pavel Radzivilovsky
fonte
2
A transferência de soma de verificação UDP está disponível da mesma forma que a transferência de soma de verificação TCP.
Ben Voigt
mas não validação de soma de verificação.
Pavel Radzivilovsky 10/10
1
Atualmente, até os adaptadores Ethernet de nível de consumidor têm descarga de soma de verificação UDP para transmissão e recepção (a descarga de recebimento está validando). E vi esse recurso no hardware de prosumer há uma década, tenho certeza que ele está nas NICs da classe de servidor por mais tempo.
Ben Voigt
-2

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

Himanshu Saxena
fonte