TLDR: l'inconveniente maggiore che potresti notare quando multiplexing più canali su TCP (se lo fai correttamente) è un aumento della latenza a causa del blocco della linea di testa tra i canali.
Corollario: se non ti interessa la latenza dovresti stare bene.
D'altra parte utilizzando una singola connessione TCP "significa meno concorrenza con altri flussi e vita più lunga
connessioni, che a loro volta portano a un migliore utilizzo di
capacità di rete disponibile ".
Blocco del blocco della linea di testa su TCP
Se si multiplex più canali sullo stesso flusso TCP, i canali potrebbero soffrire di block-of-line blocking :
Head-of-line blocking (HOL) can occur when transport protocols
offer ordered or partial-ordered service: If segments get
lost, subsequent messages have to wait for the successful
retransmission in the receiver queue and are thus delayed.
Quando esegui il multiplexing di più stream su TCP, ottieni HOL tra i canali .
Se il canale A ha riempito il buffer di invio TCP, è necessario attendere prima che tutti questi dati vengano ricevuti prima che qualsiasi nuovo dato del canale B possa essere effettivamente trasmesso al livello dell'applicazione remoto.
Vedi "Multiplexing su TCP" per maggiori dettagli sui canali multiplexing su TCP e su discussione su hackernews .
Esempi di multiplexing su TCP
Multiplexing del canale su SSH (su TCP)
Un tipico esempio di questo è SSH. SSH può multiplexare più canali (vedere ControlMaster
, ControlPath
e ControlPersist
in OpenSSH). L'utilizzo 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 più stream TCP): se si sta utilizzando un sistema interattivo sessioni e inizia a generare un pesante trasferimento di file sullo stesso canale, la tua sessione inizierà a diventare molto meno interattiva.
Multiplexed HTTP / 2 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 added request pipelining, but this only partially
addressed request concurrency and still suffers from
head-of-line blocking.
[...]
The resulting protocol is more friendly to the network because fewer
TCP connections can be used in comparison to HTTP/1.x.
This means less competition with other flows and longer-lived
connections, which in turn lead to better utilization of
available network capacity.
Tuttavia ciò che non viene discusso è che il blocco HOL non è stato risolto completamente. HTTP / 2 su TCP ancora soffre ) da Blocco HOL di blocco TCP .
Questo è discusso in questo
articolo LWN su QUIC:
HTTP/2 was designed to address this problem using multiple "streams"
built into a single connection.
[...] it creates a new problem: the loss of a single packet
will stall transmission of all of the streams at once,
creating new
latency issues. This variant on the head-of-line-blocking problem is
built into TCP itself and cannot be fixed with more tweaks at the HTTP
level.
Altre strategie di multiplexing
SCTP
Questa è una delle caratteristiche distintive di SCTP (multistreaming), puoi avere più stream indipendenti nella stessa associazione SCTP e ogni stream non blocca gli altri.
Vedi SSH su SCTP - Ottimizzazione di un multicanale
Protocollo adattandolo a SCTP per l'effetto dell'utilizzo di SCTP al fine di evitare il blocco HOL cross-channel in SSH:
SCTP only preserves the order of the messages within a single
stream to mitigate an effect known as head-of-line blocking.
If a message is lost, the subsequent messages
have to be delayed until the lost one is retransmitted
to preserve the order. Since only messages of the same
stream have to be delayed, the number of affected
messages after a loss is reduced.
[...]
By mapping the channels of SSH onto SCTP’s streams, the
benefit of multi-streaming is made available to SSH, which
is the mitigation of head-of-line blocking.
SCTP non è necessariamente facile da implementare (a causa della disponibilità del sistema operativo, dell'interazione della casella centrale, ecc.). Una possibilità è di implementarlo su UDP nello spazio utente .
QUIC (multiplexing su UDP)
Un altro esempio è il protocollo sperimentale QUIC utilizzato per multiplexing HTTP su UDP (perché multiplexing di più stream su TCP come HTTP / 2 ha problemi di blocco HOL ):
QUIC is a new transport which reduces latency compared to that of
TCP. On the surface, QUIC is very similar to TCP+TLS+HTTP/2 implemented
on UDP.
[...]
Multiplexing without head of line blocking
Protocollo QUIC di Google: lo spostamento del web da TCP a UDP presenta una buona panoramica dei blocchi QUIC e HOL quando si multiplexano i canali su TCP.
Una recente presentazione afferma che HTTP su QUIC migliora la latenza ma il miglioramento del blocco HOL è un "vantaggio minore":
0-RTT, Over 50% of the latency improvement
[…]
Fewer timeout based retransmissions improve tail latency […]
Other, smaller benefits, e.g. head of line blocking
Si noti che mentre il 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.