É uma boa idéia multiplexar fluxos de bloqueio em uma conexão TCP?


13

Eu preciso de vários canais duplex entre dois hosts. Há várias vantagens em estabelecer apenas uma conexão TCP. Mas duvido que a multiplexação cause alguns problemas inevitáveis. Isso prejudicará o desempenho ou aumentará significativamente a latência? E o uso de memória e CPU? Você gostaria de dar alguma sugestão ou advertência?

Respostas:


10

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, ControlPathe ControlPersistem 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 .


Não acho que a HOL seja um problema real, se houver um mecanismo de controle de fluxo. Abrir várias conexões TCP também cria vários buffers de janela, que podem não ser mais eficientes na memória.
Sherwood Wang

Eu considerei o SCTP. Mas parece que o SCTP ainda não foi muito portátil e os dispositivos NAT o lidam mal.
Sherwood Wang

@ SherwoodWang, Ter um mecanismo de controle de fluxo em seu protocolo de multiplexação não impedirá que ocorra o bloqueio de HOL.
Ysdx

Quando não há dados disponíveis no remetente, o remetente pode enviar um quadro de controle de fluxo para dizer ao receptor para alternar para o próximo canal multiplexado e continuar enviando quadros de dados desse canal. Como o receptor está cheio, um mecanismo semelhante também pode ser usado. Definitivamente, evita o bloqueio de HOL com apenas metade de uma latência de ida e volta.
Sherwood Wang

@ SherwoodWang, o problema do TCP HOL está realmente no lado receptor. Se algum pacote foi perdido na transmissão, o receptor não pode fornecer os seguintes pacotes ao espaço do usuário. Ele precisa aguardar que o pacote seja retransmitido e recebido. Todos os dados restantes (evento de outro fluxo multiplexado) são bloqueados até que este pacote seja recebido.
ysdx

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).


2

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.