Cosa usi quando hai bisogno di un UDP affidabile?


92

Se hai una situazione in cui una connessione TCP è potenzialmente troppo lenta e una "connessione" UDP è potenzialmente troppo inaffidabile, cosa usi? Esistono vari protocolli UDP standard affidabili, quali esperienze hai con loro?

Si prega di discutere un protocollo per risposta e se qualcun altro ha già menzionato quello che si utilizza, valutare la possibilità di votarlo e di utilizzare un commento per elaborare se necessario.

Sono interessato alle varie opzioni qui, di cui TCP è a un'estremità della scala e UDP è all'altra. Sono disponibili varie opzioni UDP affidabili e ciascuna porta alcuni elementi di TCP in UDP.

So che spesso TCP è la scelta corretta, ma avere un elenco delle alternative è spesso utile per aiutare a giungere a questa conclusione. Cose come Enet, RUDP, ecc. Che sono costruite su UDP hanno vari pro e contro, le hai usate, quali sono le tue esperienze?

A scanso di equivoci non ci sono più informazioni, questa è una domanda ipotetica e una che speravo avrebbe suscitato un elenco di risposte che dettagliava le varie opzioni e alternative a disposizione di qualcuno che ha bisogno di prendere una decisione.


1
Questa domanda sembra essere fuori tema perché è un sondaggio per le tecnologie
Dave Hillier il

Coloro che pensano che TCP sia il migliore in tutti i casi, si prega di leggere: en.wikipedia.org/wiki/Bandwidth-delay_product
nullptr

Wikipedia ha una bella tabella che confronta vari aspetti di UDP, UDP Lite, TCP, Multipath TCP, SCTP, DCCP e RUDP . SCTP supporta la maggior parte delle funzionalità in quell'elenco.
Evgeniy Berezovsky,

@EugeneBeresovsky Ho fatto una piccola ricerca su SCTP, la maggior parte delle informazioni, comprese le risposte SO, risalgono al 2013 e precedenti.La maggior parte delle persone ha scritto allora che l'adozione di SCTP era molto bassa. Mi chiedo come sia oggi? Inoltre, vedi questo thread stackoverflow.com/questions/1171555/…
Michael IV

@MichaelIvanov L'adozione è davvero bassa. Ma se intendi usarlo all'interno del tuo data center, non ti interessa l'adozione esterna, a patto che switch e router non causino problemi (cosa che, in un data center, non dovrebbero) e tu abbia OS e il supporto per le biblioteche, che potrebbe essere un problema, come descritto in una delle risposte nella domanda a cui ti sei collegato.
Evgeniy Berezovsky

Risposte:


25

È difficile rispondere a questa domanda senza alcune informazioni aggiuntive sul dominio del problema. Ad esempio, quale volume di dati stai utilizzando? Quante volte? Qual è la natura dei dati? (es. è un dato unico, una tantum? O è un flusso di dati di esempio? ecc.) Per quale piattaforma stai sviluppando? (es. desktop / server / incorporato) Per determinare cosa intendi per "troppo lento", quale mezzo di rete stai utilizzando?

Ma in termini (molto!) Generali penso che dovrai sforzarti di battere tcp per la velocità, a meno che tu non possa fare alcune supposizioni rigide sui dati che stai cercando di inviare.

Ad esempio, se i dati che stai tentando di inviare sono tali da poter tollerare la perdita di un singolo pacchetto (ad es. Dati campionati regolarmente dove la frequenza di campionamento è molte volte superiore alla larghezza di banda del segnale), allora probabilmente puoi sacrificare una certa affidabilità della trasmissione assicurandosi di poter rilevare la corruzione dei dati (es. attraverso l'uso di un buon crc)

Ma se non puoi tollerare la perdita di un singolo pacchetto, allora dovrai iniziare a introdurre i tipi di tecniche per l'affidabilità che tcp ha già. E, senza impegnarti in una quantità ragionevole di lavoro, potresti scoprire che stai iniziando a costruire quegli elementi in una soluzione per lo spazio utente con tutti i problemi di velocità inerenti.


4
Ok, aggiusterò la domanda. Sono più interessato ai pro e ai contro dei vari protocolli UDP affidabili disponibili piuttosto che a una risposta "usa TCP";)
Len Holgate,

9
@Andrew - È molto FACILE battere TCP in due casi: (1) la tua applicazione ha requisiti di affidabilità più leggeri di "tutti i dati, sempre in ordine, senza duplicati, senza code eccessive". Oppure (2) stai usando multicast. L'UDP affidabile è molto comune per gli ambienti multicast.
Tom

4
Inoltre, il TCP soffre terribilmente quando viene utilizzato su una connessione WAN (problemi a lungo raggio). Perché, semplice. TCP utilizza finestre in cui devono essere acquisiti i pacchetti nella finestra. I protocolli ACK soffrono a causa della latenza dovuta alla distanza della linea. Google: WAN TCP "speed of light"
Ajaxx

3
@Ajaxx, hai ragione su questo, tuttavia, TCP / IP lo fa di proposito a causa dell'ultimo crollo di Internet. Se stai facendo un protocollo ad alta velocità di trasmissione senza alcun controllo della congestione, beh, in pratica vergognati. Se possiedi la rete, scatenati.
Kevin Nisbet

2
"dove la frequenza di campionamento è significativamente più alta della frequenza di nyquist" - la frequenza di campionamento è sempre il doppio della frequenza di nyquist, per definizione.
Steve il

27

Che dire di SCTP . È un protocollo standard dell'IETF (RFC 4960)

Ha capacità di chunking che potrebbe aiutare per la velocità.

Aggiornamento: un confronto tra TCP e SCTP mostra che le prestazioni sono confrontabili a meno che non si possano utilizzare due interfacce.

Aggiornamento: un bell'articolo introduttivo .


Questo è positivo, sono più interessato a cose che possono essere costruite su UDP piuttosto che su IP, ma è certamente qualcosa che si adatta allo spazio della soluzione.
Len Holgate,

SCTP ha molte ottime funzionalità (come il multihoming) e con l'estensione dell'affidabilità parziale (RFC 3758) è un'opzione incredibilmente flessibile. È incluso nelle ultime versioni del kernel Linux, ma per Windows dovrai installare il tuo stack SCTP.
Andrew Johnson,

6
SCTP può essere incanalato su UDP. tools.ietf.org/id/draft-ietf-sigtran-sctptunnel-00.txt
Miglia

Grazie Miles, è un link utile!
Len Holgate

1
Sì ... Ma è probabile che qualcosa che è costruito sopra UDP piuttosto che allo stesso livello di UDP sia più facile da implementare nello spazio utente, almeno su Windows ...
Len Holgate

21

ENET - http://enet.bespin.org/

Ho lavorato con ENET come protocollo UDP affidabile e ho scritto una versione compatibile con i socket asincroni per un mio cliente che la utilizza nei loro server. Funziona abbastanza bene ma non mi piace l'overhead che il ping peer to peer aggiunge a connessioni altrimenti inattive; quando si hanno molte connessioni, eseguire il ping di tutte regolarmente è molto impegnativo.

ENET offre la possibilità di inviare più "canali" di dati e di rendere i dati inviati inaffidabili, affidabili o in sequenza. Include anche il già citato ping peer to peer che funge da mantenimento in vita.


14

Abbiamo alcuni clienti del settore della difesa che utilizzano UDT (trasferimento dati basato su UDP) (vedere http://udt.sourceforge.net/ ) e ne sono molto soddisfatti. Vedo che ha anche una licenza BSD amichevole.


2
Puoi approfondire i tuoi clienti e i loro casi d'uso, in particolare nel settore della difesa? Probabilmente no, ma vale la pena provare. In realtà ho lanciato l'idea ai miei superiori su UDT in un'applicazione di trasferimento file, ma non è ancora andata da nessuna parte.
Thomas Owens

10

RUDP - Protocollo datagramma utente affidabile

Ciò fornisce:

  • Riconoscimento dei pacchetti ricevuti
  • Windowing e controllo della congestione
  • Ritrasmissione di pacchetti persi
  • Overbuffering (più veloce dello streaming in tempo reale)

Sembra leggermente più configurabile per quanto riguarda il mantenimento in vita rispetto a ENet ma non ti dà tante opzioni (cioè tutti i dati sono affidabili e sequenziati non solo i bit che decidi dovrebbero essere). Sembra abbastanza semplice da implementare.


Stavo guardando questo ma non sembrano esserci molte implementazioni. Hai una raccomandazione?
Nicholas

No scusa. Alla fine non l'ho utilizzato e avrei sempre eseguito un'implementazione da zero.
Len Holgate

9

Come altri hanno sottolineato, la tua domanda è molto generale e se qualcosa è "più veloce" di TCP dipende molto dal tipo di applicazione.

Il protocollo TCP è generalmente veloce quanto lo è per lo streaming affidabile di dati da un host a un altro. Tuttavia, se la tua applicazione esegue molti piccoli burst di traffico e attende risposte, UDP potrebbe essere più appropriato per ridurre al minimo la latenza.

C'è una facile via di mezzo. L'algoritmo di Nagle è la parte del TCP che aiuta a garantire che il mittente non sovraccarichi il destinatario di un grande flusso di dati, con conseguente congestione e perdita di pacchetti.

Se hai bisogno della consegna affidabile e in ordine di TCP e anche della risposta rapida di UDP e non devi preoccuparti della congestione dall'invio di grandi flussi di dati, puoi disabilitare l'algoritmo di Nagle:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

Come ho detto, supponendo che TCP sia a un'estremità della scala e UDP all'altra, cos'altro c'è.
Len Holgate,

Se vuoi essere pedante, la maggior parte dei protocolli discussi si basa su UDP.
Smo

L'assunto che TCP si trovi a un'estremità e UDP all'altra è falso. Ad esempio, UDP non ha controllo del flusso, è possibile inviare facilmente pacchetti troppo velocemente, facendo sì che un router intermedio li scarichi tutti. Quindi cosa fai ? Ignorare i pacchetti persi o inviarli nuovamente? Inviandoli di nuovo e finirai per reimplementare più o meno TCP. Un'altra opzione per una comunicazione affidabile è SCTP.
n.

1
Una risposta rapida non equivale necessariamente a un throughput elevato.
Matt

1
Non sono d'accordo. Quando nagle viene utilizzato su protocolli basati su TCP con molti pacchetti più piccoli, li unirà e creerà pacchetti più grandi. Causa un leggero ritardo nell'invio, quindi la latenza potrebbe aumentare leggermente. Tuttavia, il throughput può essere inferiore con nagle disattivato perché più pacchetti = più intestazioni di pacchetto = maggiore overhead. I pacchetti rilasciati su una LAN di solito hanno più a che fare con il riempimento dei buffer di input. Se hai molti client che inviano dati allo stesso host, potrebbe non fare alcuna differenza. Non credo che spegnere e riaccendere nagle lo farà in pratica.
Matt

8

Chiunque decida che l'elenco sopra riportato non è sufficiente e che desidera sviluppare il proprio UDP affidabile dovrebbe assolutamente dare un'occhiata alle specifiche QUIC di Google in quanto copre molti casi d'angolo complicati e potenziali attacchi di negazione del servizio. Non ho ancora giocato con un'implementazione di questo e potresti non volere o aver bisogno di tutto ciò che fornisce, ma vale la pena leggere il documento prima di intraprendere un nuovo progetto UDP "affidabile".

Un buon punto di partenza per QUIC è qui , sul Chromium Blog.

L'attuale documento di progettazione QUIC può essere trovato qui .


4

Se hai una situazione in cui una connessione TCP è potenzialmente troppo lenta e una "connessione" UDP è potenzialmente troppo inaffidabile, cosa usi? Esistono vari protocolli UDP standard affidabili, quali esperienze hai con loro?

La parola chiave nella tua frase è "potenzialmente". Penso che tu abbia davvero bisogno di dimostrare a te stesso che il TCP è, in effetti, troppo lento per le tue esigenze se hai bisogno di affidabilità nel tuo protocollo.

Se vuoi ottenere affidabilità da UDP, in pratica reimplementerai alcune delle funzionalità di TCP oltre a UDP, il che probabilmente renderà le cose più lente del semplice utilizzo di TCP in primo luogo.


Sì, lo ha detto Andrew Edgecombe, ma, come ho detto, sono interessato ai pro e ai contro di QUALI alternative ci sono. Senza quell'elenco di alternative e dei loro pro e contro, è difficile decidere cosa sia meglio.
Len Holgate,

Data una funzione di affidabilità nota, a volte un flusso UDP può essere regolato manualmente per superare il flusso TCP nel sistema operativo. Raro però.
Joshua,

1
@ 17 di 26, sono d'accordo con Len Holgate, il TCP sarà più lento dell'UDP affidabile in alcune circostanze. Come la rete BDP alta, supponi di avere una connessione Internet a 1 Gbps dalla Cina a NewYork, sono sicuro che TCP farà schifo per utilizzare quasi tutta la velocità di 1 Gbps. Il protocollo TCP è migliore per la maggior parte delle connessioni sulla terra, ma non per le reti con un prodotto con ritardo di larghezza di banda elevata.
nullptr


3

Potrebbe essere RFC 5405 , "Linee guida per l'utilizzo di UDP unicast per progettisti di applicazioni" sarà utile per te.


2

Hai considerato la compressione dei tuoi dati?

Come affermato sopra, non abbiamo informazioni sulla natura esatta del tuo problema, ma la compressione dei dati per trasportarli potrebbe aiutare.


1
Soprattutto con le moderne librerie di compressione. Alcuni sono veloci come un memcpy. ad esempio lz4.
Matt


-3

Il modo migliore per ottenere l'affidabilità utilizzando UDP è costruire l'affidabilità nel programma applicativo stesso (ad esempio, aggiungendo meccanismi di riconoscimento e ritrasmissione)

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.