UDP vs TCP, quanto è più veloce? [chiuso]


194

Per lo scambio di messaggi di protocollo generale, che può tollerare una perdita di pacchetti. Quanto è più efficiente UDP su TCP?


Puoi anche aggiungere il tag "tcp" poiché anche la domanda riguarda TCP.
Cristian Ciupitu,

5
Che cosa significa "scambio di messaggi di protocollo generale"? La domanda deve chiarire quale sia l'efficienza. Vogliamo meno latenza per un piccolo messaggio? Oppure, vogliamo un throughput più elevato per un flusso continuo di dati?
Johan Boulé,

Tcp ha funzionalità migliori di UDP ad eccezione della velocità.
RAJKUMAR NAGARETHINAM,

3
La questione della velocità TCP vs. UDP è controversa. La domanda nel titolo in realtà non corrisponde al corpo della domanda. Entrambi i pacchetti TCP e UDP viaggiano esattamente alla stessa velocità sullo stesso supporto.
Ron Maupin,

Risposte:


86

UDP è più veloce di TCP e la semplice ragione è perché il suo pacchetto di riconoscimento (ACK) inesistente che consente un flusso di pacchetti continuo, anziché TCP che riconosce un insieme di pacchetti, calcolato utilizzando la dimensione della finestra TCP e il tempo di andata e ritorno (RTT).

Per ulteriori informazioni, raccomando la spiegazione Skullbox semplice ma molto comprensibile (TCP vs. UDP)


19
In realtà ci sono molti casi in cui TCP è effettivamente più veloce di UDP. Vedi la mia risposta qui sotto.
Robert S. Barnes,

2
Ciò che è più veloce dipende interamente dalle caratteristiche del traffico.

4
Sebbene la risposta possa essere corretta, non risponde alla domanda e ripete ripetutamente le conoscenze menzionate altrove. Inoltre, non menziona il fatto che i metodi UDP affidabili con ACK possono essere notevolmente più veloci di TCP.
Elliot Woods,

268

La gente dice che la cosa principale che TCP ti dà è l'affidabilità. Ma questo non è proprio vero. La cosa più importante che ti dà TCP è il controllo della congestione: puoi eseguire 100 connessioni TCP su un collegamento DSL tutte andando alla massima velocità e tutte e 100 le connessioni saranno produttive, perché "percepiscono" tutta la larghezza di banda disponibile. Provalo con 100 diverse applicazioni UDP, spingendo tutti i pacchetti il ​​più velocemente possibile e vedi come funzionano le cose per te.

Su larga scala, questo comportamento TCP è ciò che impedisce a Internet di bloccarsi nel "collasso della congestione".

Cose che tendono a spingere le applicazioni verso UDP:

  • Semantica della consegna di gruppo: è possibile eseguire consegne affidabili a un gruppo di persone in modo molto più efficiente rispetto al riconoscimento punto-punto di TCP.

  • Consegna fuori ordine: in molte applicazioni, purché si ottengano tutti i dati, non ti interessa l'ordine in cui arrivano; puoi ridurre la latenza a livello di app accettando un blocco fuori ordine.

  • Scortesia: in una festa LAN, potrebbe non interessarti se il tuo browser web funziona bene fintanto che stai inviando aggiornamenti alla rete il più velocemente possibile.

Ma anche se ti preoccupi delle prestazioni, probabilmente non vuoi andare con UDP:

  • Ora sei pronto per l'affidabilità e molte delle cose che potresti fare per implementare l'affidabilità possono finire per essere più lente di quanto già faccia TCP.

  • Ora sei ostile alla rete, il che può causare problemi negli ambienti condivisi.

  • Ancora più importante, i firewall ti bloccheranno.

È possibile superare potenzialmente alcuni problemi di prestazioni e latenza TCP "trunking" più connessioni TCP insieme; iSCSI lo fa per aggirare il controllo della congestione sulle reti locali, ma puoi anche farlo per creare un canale di messaggi "urgenti" a bassa latenza (il comportamento "URGENTE" di TCP è totalmente rotto).


18
Buona risposta, andrei anche più in generale, "controllo del flusso" (al contrario del controllo della congestione, che è un sottoinsieme del controllo del flusso). Non solo più connessioni TCP possono condividere un collegamento, ma impedirebbe anche al mittente di sovraccaricare il buffer del destinatario se interrompono l'elaborazione dei dati in entrata per qualsiasi motivo.
Alex B,

1
@AaronLS: aumenti di perdita di pacchetti e RTT (tempo di andata e ritorno) (che può essere visto come un proxy per il ritardo di accodamento ) sono / possono essere (ad esempio: le reti WiFi possono perdere pacchetti senza reale congestione, ingannando alcuni algoritmi di controllo della congestione TCP per evitare la congestione) indicatori di congestione.
ninjalj

2
UDP è un bastardo da affrontare ... Sono già sfinito. Non importa quello che faccio, non riesco a trovare un equilibrio tra prestazioni, latenza, produttività, affidabilità. Ottimo per cose in tempo reale come cose sui timer ... ma sto lavorando su una sostituzione TCP usando UDP e Forward Error Correction e questo è molto più difficile di quanto pensassi. Controllo della congestione. Un sistema universale che funziona su reti da 1 GB e reti wireless lo stesso è un'opera d'arte. Mi sento come se stessi cercando di riassemblare i pacchetti caricati in un fucile.
Jason Nelson,

1
Tra l'altro un altro a favore di TCP è che è intrinsecamente orientato alla connessione, il che semplifica notevolmente la logica di gestione del client dell'applicazione ( listen-> accept-> lo stato del client è naturalmente indipendente dagli altri client). La gestione di più connessioni da un singolo client in particolare diventa nodosa con UDP. E un punto a favore di UDP è che gli stack UDP sono davvero facili da implementare, il che è un enorme vantaggio per i sistemi embedded (microcontrollori, FPGA, ecc., In particolare un'implementazione TCP per un FPGA è generalmente qualcosa che desideri acquistare da qualcun altro e non pensarci).
Jason C

1
Tutto ciò presuppone solo che siamo interessati alla consegna di dati significativi (senza preoccuparsi troppo della latenza). In parecchie app (giochi / VoIP), la situazione è drasticamente diversa: abbiamo una quantità molto piccola di dati, ma ci preoccupiamo molto delle latenze MOLTO; è questa cosa semplice che rappresenta il 99% degli usi legittimi per UDP. E qualche suggerimento: (a) la consegna di gruppo NON funziona su Internet (e probabilmente non lo farà mai), quindi è solo il regno Intranet; (b) per Google, solo l'8-9% della popolazione di Internet ha problemi con UDP; (c) la "rete ostile" non si applica allo streaming a tariffa fissa
No-Bugs Hare

93

In alcune applicazioni TCP è più veloce (migliore throughput) di UDP.

Questo è il caso quando si eseguono molte piccole scritture relative alla dimensione MTU. Ad esempio, ho letto un esperimento in cui un flusso di pacchetti da 300 byte veniva inviato su Ethernet (MTU a 1500 byte) e TCP era il 50% più veloce di UDP .

Il motivo è che TCP proverà a bufferizzare i dati e riempirà un intero segmento di rete facendo un uso più efficiente della larghezza di banda disponibile.

UDP d'altra parte mette il pacchetto sul filo immediatamente congestionando così la rete con molti piccoli pacchetti.

Probabilmente non dovresti usare UDP a meno che tu non abbia un motivo molto specifico per farlo. Soprattutto perché puoi dare a TCP lo stesso tipo di latenza di UDP disabilitando l' algoritmo Nagle (ad esempio se stai trasmettendo dati di sensori in tempo reale e non sei preoccupato di congestionare la rete con molti piccoli pacchetti).


3
In realtà ho fatto dei benchmark in questo senso. Stavo inviando pacchetti grandi quanto UDP avrebbe supportato senza generare eccezioni (in Java) e TCP era molto più veloce. Immagino che anche molte ottimizzazioni di sistema operativo, driver e hardware facciano parte di questo.
Charlie,

14
@Myforwik: in primo luogo, non si tratta di un'implementazione definita, fa parte del protocollo TCP. Si chiama algoritmo Nagle. Aiuta a prevenire la cosiddetta sindrome della finestra sciocca. Cerca entrambi i termini. In secondo luogo, non esiste un concetto di pacchetti dal punto di vista di TCP. Infine, il libro "Efficace programmazione TCP / IP" dedica un intero capitolo a questo argomento e molti altri capitoli all'argomento correlato di sapere quando usare TCP vs. UDP. Ho sollevato questa situazione (che in realtà è abbastanza comune) perché l'OP ha posto una domanda generale, e questa è una delle tante risposte possibili.
Robert S. Barnes,

46
@Myforwik. Quando suggerisci il moronismo negli altri, prova a renderci conto che tutti abbiamo lacune nelle nostre conoscenze - hai incluso. Dopo tutto, SO è un forum per la condivisione delle conoscenze. Praticamente tutti gli sparatutto in prima persona usano UDP, ed è raro per loro inviare pacchetti di dimensioni simili a quelle dell'MTU. Se desideri andare a suggerire a John Carmack che idiota era per aver escogitato questo approccio, ti incoraggio a educarti a fondo in questo senso, prima di tutto. 15 anni e un codice di rete ad alte prestazioni di un settore non si sdraia e muore perché pensi che sia "idiota".
Ingegnere

2
" Ho letto un esperimento in cui un flusso di pacchetti da 300 byte veniva inviato su Ethernet (MTU a 1500 byte) e TCP era il 50% più veloce di UDP. " - Potresti collegare questo esperimento?
Leviatano,

3
@Leviathan È nel libro Programmazione TCP / IP efficace.
Robert S. Barnes,

31

con tolleranza alle perdite

Intendi "con tolleranza alla perdita"?

Fondamentalmente, UDP non è "tollerante alla perdita". Puoi inviare 100 pacchetti a qualcuno, che potrebbe ottenere solo 95 di questi pacchetti e alcuni potrebbero essere nell'ordine sbagliato.

Per cose come lo streaming video e il gioco multiplayer, dove è meglio perdere un pacchetto piuttosto che ritardare tutti gli altri pacchetti dietro di esso, questa è la scelta ovvia

Per la maggior parte delle altre cose, un pacchetto mancante o "riorganizzato" è fondamentale. Dovresti scrivere del codice aggiuntivo per eseguire UDP per riprovare se le cose si sono perse e applicare l'ordine corretto. Ciò aggiungerebbe un po 'di sovraccarico in alcuni punti.

Per fortuna, alcune persone molto intelligenti l'hanno fatto e lo hanno chiamato TCP.

Pensala in questo modo: se un pacchetto scompare, preferiresti semplicemente ottenere il pacchetto successivo il più rapidamente possibile e continuare (usare UDP), oppure hai effettivamente bisogno di quei dati mancanti (usa TCP). Il sovraccarico non importerà a meno che tu non sia in uno scenario davvero marginale.


1
5 pacchetti su 100? È parecchio. Immagino sia solo un esempio. Domanda: nella situazione reale quanti pacchetti si possono perdere? Perché se per esempio fosse 2 su 10000 (più meno 1), non me ne preoccuperei.
strano

1
@freakish, sì, era solo un esempio. La quantità effettiva di perdita di pacchetti dipende dalla tua connessione, dalle reti a monte, ecc. Ero solito giocare a molti giochi online e trovavo che se fossi stato solo io a utilizzare la connessione Internet, non avrei avuto alcuna perdita di pacchetti, ma non appena avessi avviato un download in background, avrei iniziato a ottenerne un po '(forse il 10% -20%). Ciò avvenne circa 5 anni fa, e potrebbero essere utili connessioni Internet più veloci.
Orion Edwards,

2
I router Internet rilasciano udp prima di tcp
user1496062

19

Quale protocollo funziona meglio (in termini di throughput) - UDP o TCP - dipende in realtà dalle caratteristiche della rete e dal traffico di rete. Robert S. Barnes, ad esempio, indica uno scenario in cui TCP ha prestazioni migliori (scritture di piccole dimensioni). Ora, considera uno scenario in cui la rete è congestionata e ha traffico TCP e UDP. I mittenti nella rete che utilizzano TCP percepiranno la "congestione" e ridurranno le loro velocità di invio. Tuttavia, UDP non ha alcun meccanismo di prevenzione della congestione o controllo della congestione e i mittenti che utilizzano UDP continuerebbero a immettere dati alla stessa velocità. A poco a poco, i mittenti TCP ridurrebbero al minimo le loro velocità di invio e se i mittenti UDP hanno abbastanza dati per essere inviati sulla rete, aumenterebbero la maggior parte della larghezza di banda disponibile. Quindi, in tal caso, I mittenti UDP avranno un throughput maggiore, poiché ottengono la più grande torta della larghezza di banda della rete. In realtà, questo è un argomento di ricerca attivo: come migliorare il throughput TCP in presenza di traffico UDP. Un modo, che conosco, che utilizza le applicazioni TCP in grado di migliorare la velocità è l'apertura di più connessioni TCP. In questo modo, anche se la velocità effettiva di ciascuna connessione TCP potrebbe essere limitata, la somma totale della velocità effettiva di tutte le connessioni TCP potrebbe essere maggiore della velocità effettiva di un'applicazione che utilizza UDP.


2
Questo non è corretto i router lasceranno cadere UDP prima di TCP. Su un filo condiviso puoi essere affogato da UDP, ma ciò che è probabile che accada in una situazione di eccesso di offerta dipende dalla tecnologia, ma è abbastanza facile per UDP degradare al punto da ricevere pochissime collisioni.
user1496062

Mi piace la tua spiegazione ma non ottengo un punto. Se le connessioni UDP possono ottenere tutto il traffico (se la larghezza di banda è bassa o i dati sono alti) in quel caso l'applicazione se l'utilizzo di TCP è sostanzialmente tenuto in ostaggio a quelli che usano UDP. Se tutte le applicazioni utilizzano TCP, allora "giocano bene" l'una con l'altra. Quindi perché consentire UDP sul rauter in primo luogo?
Igor Čordaš,

@PSIXO: Bene, TCP e UDP soddisfano requisiti applicativi diversi, quindi entrambi sono usati dalle applicazioni. L'implicazione del tuo suggerimento è che dovremmo avere un'infrastruttura di rete diversa per il traffico TCP e UDP - una proposta costosa, e certamente non qualcosa che possiamo fare ora, specialmente con tutti gli investimenti già fatti. Ecco perché i ricercatori sono impegnati a scoprire modi alternativi per bilanciare il conflitto nel "software".
gjain,

In sostanza sì, avere due infrastrutture sarebbe una soluzione perfetta ma sfortunatamente non è plausibile. Quello che volevo dire con il mio commento è che stai sopravvalutando l'HDP su TCP perché se fosse un fattore così elevato le persone disabiliterebbero UDP sul router (come fanno talvolta nelle aziende) se hanno bisogno del TCP per funzionare velocemente. Tieni presente anche che i pacchetti UDP hanno maggiori probabilità di essere abbassati rispetto a TCP. Per il resto dei fatti nella tua risposta sono pienamente d'accordo e lo trovo abbastanza utile, ma penso solo che stai sopravvalutando determinati effetti.
Igor Čordaš,

18

Quando si parla di "ciò che è più veloce" - ci sono almeno due aspetti molto diversi: rendimento e latenza.

Se si parla di throughput - il controllo del flusso di TCP (come menzionato in altre risposte), è estremamente importante e fare qualcosa di paragonabile a UDP, sebbene certamente possibile, sarebbe un grosso mal di testa (tm). Di conseguenza, l'utilizzo di UDP quando è necessario il throughput , raramente si qualifica come una buona idea (a meno che non si desideri ottenere un vantaggio sleale su TCP).

Tuttavia, se si parla di latenze , il tutto è completamente diverso. Mentre in assenza di perdita di pacchetti TCP e UDP si comportano in modo estremamente simile (qualsiasi differenza, se presente, essendo marginale) - dopo la perdita del pacchetto, l'intero modello cambia drasticamente.

Dopo qualsiasi perdita di pacchetti, TCP attenderà la ritrasmissione per almeno 200 ms (1 secondo al paragrafo 2.4 di RFC6298, ma le implementazioni moderne e pratiche tendono a ridurlo a 200 ms). Inoltre, con TCP, anche quei pacchetti che hanno raggiunto l'host di destinazione - non saranno consegnati alla tua app fino a quando non viene ricevuto il pacchetto mancante (ovvero, l'intera comunicazione è ritardata di ~ 200ms) - A proposito, questo effetto, noto come Head-of -Line Blocking, è inerente a tutti i flussi ordinati affidabili, siano essi TCP o affidabili + UDP ordinati. A peggiorare le cose: se si perde anche il pacchetto ritrasmesso, si parlerà di un ritardo di ~ 600 ms (a causa del cosiddetto backoff esponenziale, il primo ritrasmesso è 200 ms e il secondo è 200 * 2 = 400 ms). Se il nostro canale ha una perdita di pacchetti dell'1% (che non è male per gli standard di oggi), e abbiamo un gioco con 20 aggiornamenti al secondo - tali ritardi di 600ms si verificano in media ogni 8 minuti. E poiché 600 ms sono più che sufficienti per farti uccidere in un gioco frenetico - beh, è ​​piuttosto male per il gameplay. Questi effetti sono esattamente il motivo per cui i Gamedev preferiscono spesso UDP su TCP.

Tuttavia, quando si utilizza UDP per ridurre le latenze, è importante rendersi conto che il semplice "utilizzo di UDP" non è sufficiente per ottenere un sostanziale miglioramento della latenza, è tutto su COME si utilizza UDP. In particolare, mentre le librerie RUDP di solito evitano quel "backoff esponenziale" e usano tempi di ritrasmissione più brevi - se sono usate come stream "affidabili ordinati", devono comunque soffrire di Head-of-Line Blocking (quindi nel caso di un doppio perdita di pacchetti, invece di quei 600ms otterremo circa 1,5 * 2 * RTT - o per un RTT abbastanza buono da 80ms, è un ritardo di ~ 250ms, che è un miglioramento, ma è ancora possibile fare di meglio). D'altra parte, se si utilizzano le tecniche discusse in http://gafferongames.com/networked-physics/snapshot-compression/ e / o http: // ithare. , È possibile eliminare completamente il blocco Head-of-Line (quindi per una perdita a doppio pacchetto per un gioco con 20 aggiornamenti / secondo, il ritardo sarà di 100 ms indipendentemente da RTT).

E come nota a margine - se ti capita di avere accesso solo a TCP ma senza UDP (come nel browser o se il tuo client è dietro uno dei 6-9% dei brutti firewall che bloccano UDP) - sembra che ci sia un modo per implementare UDP-over-TCP senza incorrere in troppe latenze, vedere qui: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (assicurarsi di leggere anche i commenti (!)).


13

Ogni connessione TCP richiede una stretta di mano iniziale prima che i dati vengano trasmessi. Inoltre, l'intestazione TCP contiene molti overhead destinati a diversi segnali e rilevamento della consegna dei messaggi. Per uno scambio di messaggi, probabilmente UDP sarà sufficiente se è accettabile una piccola possibilità di errore. Se la ricevuta deve essere verificata, TCP è l'opzione migliore.


Piccola possibilità di fallimento e un limite alla dimensione del pacchetto.

11

@Andrew , mi permetto di dissentire. UDP è la scelta in alcuni tipi di applicazione a causa dei requisiti di prestazione. Un esempio classico è la videoconferenza. Questo tipo di applicazione non risponde bene al controllo TCP.

Un altro aspetto da prendere in considerazione è se hai bisogno del multicast. In tal caso, utilizzare UDP.


8
UDP viene anche usato perché se perdi un pacchetto o due, probabilmente è comunque troppo tardi, e probabilmente sei meglio saltare semplicemente e andare avanti così puoi continuare a guardare. Un piccolo blip nel video a causa di alcuni pacchetti rilasciati è molto meglio che avere tonnellate di congestione.
Kibbee,

1
Corretto: il casting multiplo della rete è piuttosto raro, la maggior parte dei router lo blocca.
user1496062

8

Se devi inviare rapidamente un messaggio attraverso la rete tra due IP che non hanno ancora parlato, un UDP arriverà almeno 3 volte più velocemente, di solito 5 volte più velocemente.


1
Qualche riferimento?
Gerard

8

Voglio solo chiarire le cose. TCP / UDP sono due macchine che sono guidate su strada. supponiamo che i segnali stradali e gli ostacoli siano errori TCP si prende cura dei segnali stradali, rispetta tutto ciò che li circonda. Guida lenta perché potrebbe succedere qualcosa all'auto. Mentre UDP si allontana, la massima velocità non ha rispetto per i segnali stradali. Niente, un guidatore pazzo. UDP non ha il recupero degli errori, se c'è un ostacolo, si scontrerà con esso e continuerà. Mentre TCP si assicura che tutti i pacchetti vengano inviati e ricevuti perfettamente, nessun errore, quindi l'auto supera gli ostacoli senza scontrarsi. Spero che questo sia un buon esempio per farti capire, perché UDP è preferito nei giochi. Il gioco ha bisogno di velocità. TCP è prefferito nei download oppure i file scaricati potrebbero essere danneggiati.


7

UDP è leggermente più veloce nella mia esperienza, ma non di molto. La scelta non dovrebbe essere fatta in base alle prestazioni ma al contenuto del messaggio e alle tecniche di compressione.

Se si tratta di un protocollo con scambio di messaggi , suggerirei che la minima prestazione ottenuta con TCP è più che valsa la pena. Ti viene data una connessione tra due punti finali che ti darà tutto ciò di cui hai bisogno. Non provare a produrre il tuo affidabile protocollo bidirezionale su UDP a meno che tu non sia davvero molto sicuro di ciò che stai intraprendendo.


5

Tieni presente che TCP di solito mantiene più messaggi in transito. Se vuoi implementarlo in UDP, avrai un sacco di lavoro se vuoi farlo in modo affidabile. La tua soluzione sarà meno affidabile, meno veloce o una quantità incredibile di lavoro. Esistono applicazioni valide di UDP, ma se stai ponendo questa domanda probabilmente non lo è.


5

C'è stato del lavoro fatto per consentire al programmatore di avere i vantaggi di entrambi i mondi.

SCTP

È un protocollo di livello di trasporto indipendente, ma può essere utilizzato come libreria che fornisce un livello aggiuntivo su UDP. L'unità base di comunicazione è un messaggio (associato a uno o più pacchetti UDP). È integrato il controllo della congestione. Il protocollo ha manopole e twiddle da attivare

  • per la consegna dei messaggi
  • ritrasmissione automatica dei messaggi persi, con parametri definiti dall'utente

se uno di questi è necessario per la tua specifica applicazione

Un problema con questo è che la creazione della connessione è un processo complicato (e quindi lento)

Altre cose simili

Un'altra cosa sperimentale proprietaria simile

Ciò cerca anche di migliorare la stretta di mano tripla di TCP e di modificare il controllo della congestione per gestire meglio le linee veloci.


3

Non ha senso parlare di TCP o UDP senza prendere in considerazione le condizioni di rete. Se la rete tra i due punti ha una qualità molto elevata, UDP è assolutamente più veloce di TCP, ma in alcuni altri casi come la rete GPRS, TCP potrebbe essere più veloce e più affidabile di UDP.


1

L'impostazione della rete è fondamentale per qualsiasi misurazione. Fa una grande differenza, se stai comunicando tramite prese sul tuo computer locale o con l'altra estremità del mondo.

Tre cose che voglio aggiungere alla discussione:

  1. Puoi trovare qui un ottimo articolo su TCP vs. UDP nel contesto dello sviluppo del gioco.
  2. Inoltre, iperf ( jperf valorizza iperf con una GUI) è uno strumento molto utile per rispondere alla tua domanda da solo misurando.
  3. Ho implementato un benchmark in Python (vedi questa domanda SO ). In media di 10 ^ 6 iterazioni la differenza per l'invio di 8 byte è di circa 1-2 microsecondi per UDP.

1
Per rendere il benchmark rilevante per Internet nel mondo reale, è necessario eseguirlo nuovamente con un simulatore di perdita di pacchetti come netem. Se lo fai nel modo giusto (e con RTT simulato di dire 100 ms e perdita di pacchetti simulata dell'1%), i risultati differiranno drasticamente. In breve, mentre le latenze TCP e UDP sono effettivamente le stesse per la perdita di pacchetti pari a zero, iniziano a differire MOLTO per ogni pacchetto perso.
No-Bugs Hare,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.