Come funzionano le trasmissioni a pacchetto multiplo con UDP?

1

Ho letto le connessioni UDP e ho capito che le trasmissioni UDP sono "Best Effort", forse i tuoi dati saranno ricevuti, forse no, e se lo fosse, potrebbe essere fuori uso. Quello che sto cercando di trovare informazioni è, cosa succede se i dati che invii tramite UDP sono abbastanza grandi da essere inviati tramite più pacchetti? Ad esempio, dire che ho un flusso di byte che viene inviato tramite 3 pacchetti:

<--data_packet_1 <--data_packet_2 <--data_packet_3

Su TCP questi pacchetti sono gaurenteed per essere consegnati e nello stesso ordine in cui sono stati inviati. Tuttavia questo non è il caso in UDP. Quindi se succede qualcosa e vengono inviati solo due pacchetti su tre:

<-- data_packet_1 <--data_packet_3

L'intero flusso di byte che è composto da tre pacchetti separati è caduto? Oppure arrivano e devono essere gestiti a livello di applicazione (cioè, se il flusso di byte non contiene il formato richiesto, ignorare).

    
posta nullReference 08.03.2018 - 20:13
fonte

2 risposte

6

I have been reading up on UDP connections

Non esiste una "connessione UDP". UDP è un protocollo senza connessione , che è praticamente la sua ragione di esistere in primo luogo.

So if something happens and only two packets out of the three get sent:

Come lo sai? Non ci sono numeri di sequenza in UDP, ogni datagramma si trova da solo. Non c'è modo di sapere che anche in questo caso dovrebbero esserci tre datagrammi. Dal punto di vista del ricevitore, ha ricevuto due datagrammi. Periodo.

L'intero motivo per cui UDP è stato inventato in primo luogo è che ci sono applicazioni in cui non puoi permetterti di aspettare finché non ottieni dati "corretti" e dove puoi permettersi di procedere con dati incompleti. UDP è stato originariamente creato per le applicazioni di telefonia, dove è più importante che la latenza sia bassa rispetto a quella che ogni campione è corretto. Le persone sono abituate agli abbandoni, ai clic e ai crepitii dei telefoni analogici, a cosa sono non abituati e non accettano è in attesa di un secondo per un pacchetto danneggiato trasmessi.

Tipicamente, in un'applicazione di questo tipo, il protocollo applicativo di livello superiore userà un qualche tipo di numero di sequenza o timestamp, in modo che possa rilevare la perdita (o l'esaurimento dell'ordine, che in un'applicazione del genere è la stessa cosa di perso) i datagrammi e basta inserire un millisecondo di silenzio (in un flusso audio) o una riga vuota (in un flusso video). Se si tratta di un protocollo basato su dati bulk anziché di uno streaming, potrebbe reintegrare i dati da datagrammi "tardivi" nel proprio modello di dati anziché trattarli come persi. Se l'applicazione non può vivere con un modello di dati incompleto, potrebbe richiedere nuovamente i dati. Ma questa è una decisione a livello di applicazione, non ha nulla a che fare con UDP.

Per i flussi video e audio, ad esempio, esiste una specifica SMPTE, l'organizzazione professionale per broadcast video e audio, chiamata SMPTE 2022-7 Seamless Protection Switching, che (semplificata) specifica come inviare lo stesso video / audio trasmettere i dati allo stesso tempo su più flussi e come il ricevitore può ricostruire il flusso originale da quei flussi multipli identici. In senso lato, i datagrammi sono marcati con il timestamp e il ricevitore prende il primo datagramma da qualsiasi stream che abbia il timestamp corretto. (È molto più complesso di quello in realtà, ovviamente.) È un modo per migliorare l'affidabilità utilizzando la ridondanza della rete anziché la ritrasmissione. In altre parole, sprechi metà dell'ampiezza di banda, ma ottieni affidabilità e tieni bassa latenza e jitter. (In un'applicazione del mondo reale, si disporrebbe in modo tale che i diversi flussi siano inviati da diverse porte di rete al trasmettitore e ricevuti da diverse porte di rete sul ricevitore, prendendo percorsi diversi attraverso la rete e trasmessi attraverso diversi interruttori e differenti cavi, ecc. per ottenere la massima ridondanza.)

    
risposta data 08.03.2018 - 20:35
fonte
1

Il livello dell'applicazione deve essere in grado di gestire pacchetti fuori ordine o pacchetti mancanti. Ma in UDP (almeno nelle implementazioni con cui ho lavorato), non si tende a trattarlo come un flusso di byte. È più di un singolo messaggio o carico utile. Spetta all'applicazione aprire il payload e fare cose con esso, il che potrebbe essere messo da parte e farlo corrispondere ad altri payload dallo stesso set di dati o scartare i dati che è irrilevante.

    
risposta data 08.03.2018 - 20:21
fonte

Leggi altre domande sui tag