TLDR: A principal desvantagem que você pode notar ao multiplexar vários canais na parte superior do TCP (se você fizer direito) é uma latência aumentada devido ao bloqueio do cabeçalho de linha entre os canais.
Corolário: Se você não se importa com a latência, deve ficar bem.
Por outro lado, usar uma única conexão TCP "significa menos concorrência com outros fluxos e conexões de vida mais longa, o que, por sua vez, leva a uma melhor utilização da capacidade de rede disponível" .
Bloqueio de cabeçalho de linha sobre TCP
Se você multiplexar vários canais sobre o mesmo fluxo TCP, os canais poderão sofrer bloqueio de cabeçalho :
O bloqueio de cabeçalho de linha (HOL) pode ocorrer quando os protocolos de transporte oferecem serviço encomendado ou parcial: Se os segmentos forem perdidos, as mensagens subseqüentes terão que aguardar a retransmissão bem-sucedida na fila do receptor e, portanto, atrasadas.
Quando você multiplexa vários fluxos sobre o TCP, obtém HOL entre os canais .
Se o canal A preencheu o buffer de envio TCP, você terá que esperar antes que todos esses dados sejam recebidos para que quaisquer novos dados do canal B possam ser efetivamente transmitidos para a camada de aplicação remota.
Consulte "Multiplexação na parte superior do TCP" para obter mais detalhes sobre canais de multiplexação na parte superior do TCP e a discussão sobre hackernews .
Exemplos de multiplexação sobre TCP
Multiplexação de canal por SSH (por TCP)
Um exemplo típico disso é SSH. SSH pode multiplex múltiplos canais (ver ControlMaster
, ControlPath
e ControlPersist
em OpenSSH). Usar isso reduz o custo de inicializar uma nova sessão SSH (latência inicial), mas a transferência pesada em um canal geralmente aumenta a latência / interatividade dos outros (o que não acontece se você usar vários fluxos TCP): se você estiver usando um interativo sessões e começar a negociar uma transferência pesada de arquivos no mesmo canal, sua sessão começará a ficar muito menos interativa.
HTTP / 2 multiplexado sobre TCP
O HTTP / 2 usa a multiplexação de solicitações / respostas sobre TCP para corrigir o bloqueio de HOL. Esse recurso é anunciado em muitos artigos e documentos sobre HTTP / 2. O RFC HTTP / 2 afirma:
O HTTP / 1.1 adicionou um pipeline de solicitação, mas isso apenas endereçou parcialmente a simultaneidade de solicitação e ainda sofre com o bloqueio do cabeçalho da linha.
[...]
O protocolo resultante é mais amigável à rede, porque menos conexões TCP podem ser usadas em comparação com HTTP / 1.x. Isso significa menos concorrência com outros fluxos e conexões de vida mais longa, o que, por sua vez, leva a uma melhor utilização da capacidade de rede disponível.
No entanto, o que não é discutido é que o bloqueio de HOL não é totalmente resolvido. HTTP / 2 sobre TCP ainda sofre ) do bloqueio de HOL no nível TCP .
Isso é discutido neste
artigo do LWN sobre o QUIC:
O HTTP / 2 foi projetado para solucionar esse problema usando vários "fluxos" integrados em uma única conexão . [...] cria um novo problema: a perda de um único pacote interromperá a transmissão de todos os fluxos de uma só vez, criando novos problemas de latência. Essa variante no problema de bloqueio do cabeçote de linha está embutida no próprio TCP e não pode ser corrigida com mais ajustes no nível HTTP.
Outras estratégias de multiplexação
SCTP
Esse é um dos recursos distintos do SCTP (multitransmissão), você pode ter vários fluxos independentes na mesma associação SCTP e cada fluxo não bloqueia os outros.
Consulte SSH sobre SCTP - Otimizando um protocolo multicanal adaptando-o ao SCTP para obter o efeito de usar o SCTP para evitar o bloqueio HOL de canal cruzado no SSH:
O SCTP preserva apenas a ordem das mensagens em um único fluxo para mitigar um efeito conhecido como bloqueio de linha de frente. Se uma mensagem for perdida, as mensagens subseqüentes deverão ser adiadas até que a perdida seja retransmitida para preservar o pedido. Como apenas as mensagens do mesmo fluxo precisam ser atrasadas, o número de mensagens afetadas após uma perda é reduzido.
[...]
Ao mapear os canais do SSH nos fluxos do SCTP, o benefício do multi-streaming é disponibilizado ao SSH, que é a atenuação do bloqueio do cabeçalho da linha .
O SCTP não é necessariamente fácil de implantar (devido à disponibilidade do SO, interação da caixa do meio, etc.). Uma possibilidade é implementá-lo sobre UDP no espaço do usuário .
QUIC (multiplexação sobre UDP)
Outro exemplo, é o protocolo QUIC experimental usado para multiplexar HTTP sobre UDP (porque a multiplexação de múltiplos fluxos sobre o TCP, pois o HTTP / 2 sofre com o bloqueio de HOL ):
QUIC é um novo transporte que reduz a latência em comparação com o TCP. Na superfície, o QUIC é muito semelhante ao TCP + TLS + HTTP / 2 implementado no UDP.
[...]
Multiplexação sem bloqueio do cabeçote de linha
Protocolo QUIC do Google: mover a web do TCP para o UDP apresenta uma boa visão geral do bloqueio QUIC e HOL ao multiplexar canais no topo do TCP.
Uma apresentação recente afirma que o HTTP sobre QUIC melhora a latência, mas que a melhoria do bloqueio de HOL é um "benefício menor":
0-RTT, mais de 50% da melhoria da latência
[...]
Menos retransmissões baseadas em timeout melhoram a latência da cauda […]
Outros benefícios menores, por exemplo, bloqueio do chefe de linha
Observe que, embora o QUIC seja descrito como "muito semelhante ao TCP + TLS + HTTP / 2 implementado no UDP", é de fato um transporte de uso geral que pode ser usado independentemente do HTTP / 2 e pode atender às suas necessidades.
Nota: HTTP / QUIC si será padronizado como HTTP / 3 .
Eu diria que você precisa ler o Guia ZeroMQ , os padrões que ele fornece com as razões e as desvantagens são essenciais.
Mas, caso contrário, não há problema em desconectar o canal de rede da entrega de dados do aplicativo. Você terá que fazer o muxing e o desmuxamento de pacotes de dados enviados (e eu recomendaria uma arquitetura baseada em pacotes aqui, sem transmitir dados em um fluxo contínuo) e o armazenamento em buffer em cada extremidade.
Caso contrário, deve haver pouco impacto; talvez seja necessário mais memória - mas apenas um pouco - para armazenar dados em buffer e um pouco mais de CPU, pois você manipula mais código para bloquear e analisar pacotes, mas nada significativo. (a menos que você esteja escrevendo algo especializado que exija uma grande taxa de transferência e desempenho seja crítico).
fonte
Sim, eu criei um sistema de banco de dados cliente-servidor usando exatamente esse princípio.
Os canais multiplexados na única conexão TCP enviam pacotes de dados, que são então divididos nos respectivos destinatários na outra extremidade.
A proteção da conexão por um canal tagarela é feita pelo remetente da conexão TCP, fazendo a seleção round-robin de qual pacote transmitir entre os canais que têm dados prontos para envio.
Para lidar com o caso de um canal decidir enviar um pacote de 1 GB e bloquear todos os outros, o remetente pode optar por dividir um pacote em pedaços e enviar apenas um pedaço antes de dar a volta a outro canal. Na extremidade receptora, a remontagem de pedaços em um pacote é feita antes que o destinatário veja o pacote.
fonte