TLDR: il principale svantaggio che potresti notare quando multiplexing più canali su TCP (se lo fai correttamente) è una latenza aumentata a causa del blocco head-of-line tra i canali.
Corollario: se non ti interessa la latenza, dovresti stare bene.
D'altra parte, utilizzare una singola connessione TCP "significa meno concorrenza con altri flussi e connessioni più durature, il che a sua volta porta a un migliore utilizzo della capacità di rete disponibile" .
Blocco blocco head-of-line su TCP
Se si multiplexano più canali sullo stesso flusso TCP, i canali potrebbero soffrire di blocco head-of-line :
Il blocco head-of-line (HOL) può verificarsi quando i protocolli di trasporto offrono un servizio ordinato o parziale: Se i segmenti vengono persi, i messaggi successivi devono attendere la corretta ritrasmissione nella coda del ricevitore e sono quindi ritardati.
Quando si eseguono il multiplexing di più stream su TCP, si ottiene HOL tra i canali .
Se il canale A ha riempito il buffer di invio TCP, dovrai attendere prima che tutti questi dati vengano ricevuti prima che qualsiasi nuovo dato del canale B possa essere effettivamente trasmesso al livello dell'applicazione remota.
Vedi "Multiplexing su TCP" per maggiori dettagli sui canali multiplexing su TCP e la discussione su hackernews .
Esempi di multiplexing su TCP
Channel multiplexing su SSH (su TCP)
Un tipico esempio di questo è SSH. SSH può multiplex più canali (si veda ControlMaster, ControlPathe ControlPersistin OpenSSH). L'uso di questo riduce il costo di inizializzazione di una nuova sessione SSH (latenza iniziale) ma il trasferimento pesante su un canale di solito aumenta la latenza / l'interattività degli altri (cosa che non accade se si utilizza un flusso TCP multiplo): se si utilizza un interattivo sessioni e inizia a generare un trasferimento di file pesante sullo stesso canale, la sessione inizierà a diventare molto meno interattiva.
HTTP / 2 multiplex su TCP
HTTP / 2 utilizza il multiplexing di richieste / risposte su TCP per correggere il blocco HOL. Questa funzione è pubblicizzata in molti articoli e articoli su HTTP / 2. Le richieste RFC HTTP / 2 :
HTTP / 1.1 ha aggiunto il pipelining delle richieste, ma questo ha affrontato solo parzialmente la concorrenza delle richieste e soffre ancora del blocco head-of-line.
[...]
Il protocollo risultante è più amichevole con la rete perché è possibile utilizzare un numero inferiore di connessioni TCP rispetto a HTTP / 1.x. Ciò significa una minore concorrenza con altri flussi e connessioni di maggiore durata, che a loro volta portano a un migliore utilizzo della capacità di rete disponibile.
Tuttavia, ciò che non viene discusso è che il blocco HOL non viene risolto del tutto. HTTP / 2 su TCP soffre ancora ) del blocco HOL a livello TCP .
Questo è discusso in questo
articolo LWN su QUIC:
HTTP / 2 è stato progettato per risolvere questo problema utilizzando più "stream" integrati in una singola connessione . [...] crea un nuovo problema: la perdita di un singolo pacchetto interromperà la trasmissione di tutti i flussi contemporaneamente, creando nuovi problemi di latenza. Questa variante del problema del blocco head-of-line è integrata nel TCP stesso e non può essere risolta con ulteriori modifiche a livello HTTP.
Altre strategie multiplexing
SCTP
Questa è una delle caratteristiche distintive di SCTP (multistreaming), puoi avere più flussi indipendenti nella stessa associazione SCTP e ogni flusso non blocca gli altri.
Vedi SSH su SCTP - Ottimizzare un protocollo multicanale adattandolo a SCTP per l'effetto dell'uso di SCTP al fine di evitare il blocco HOL tra canali in SSH:
SCTP mantiene l'ordine dei messaggi all'interno di un singolo flusso per mitigare un effetto noto come blocco head-of-line. Se un messaggio viene perso, i messaggi successivi devono essere ritardati fino a quando quello perso viene ritrasmesso per preservare l'ordine. Poiché è necessario ritardare solo i messaggi dello stesso flusso, il numero di messaggi interessati dopo una perdita è ridotto.
[...]
Mappando i canali di SSH sui flussi di SCTP, il vantaggio del multi-streaming è reso disponibile a SSH, che è la mitigazione del blocco head-of-line .
SCTP non è necessariamente facile da distribuire (a causa della disponibilità del sistema operativo, dell'interazione della middlebox, ecc.). Una possibilità è implementarla su UDP nello spazio utenti .
QUIC (multiplexing su UDP)
Un altro esempio è il protocollo sperimentale QUIC utilizzato per il multiplexing HTTP su UDP (perché il multiplexing di più flussi su TCP in quanto HTTP / 2 soffre di blocco HOL ):
QUIC è un nuovo trasporto che riduce la latenza rispetto a quella del TCP. A prima vista, QUIC è molto simile a TCP + TLS + HTTP / 2 implementato su UDP.
[...]
Multiplexing senza blocco della linea di testa
Protocollo QUIC di Google: lo spostamento del Web da TCP a UDP presenta una buona panoramica del blocco QUIC e HOL quando si esegue il multiplexing dei canali su TCP.
Una recente presentazione afferma che HTTP su QUIC migliora la latenza ma che il miglioramento del blocco HOL è un "vantaggio minore":
0-RTT, oltre il 50% del miglioramento della latenza
[...]
Meno ritrasmissioni basate sul timeout migliorano la latenza della coda […]
Altri vantaggi minori, ad esempio il blocco del capo linea
Si noti che mentre QUIC è descritto come "molto simile a TCP + TLS + HTTP / 2 implementato su UDP", in realtà è un trasporto generico che può essere utilizzato indipendentemente da HTTP / 2 e potrebbe soddisfare le tue esigenze.
Nota: HTTP / QUIC verrà standardizzato come HTTP / 3 .