Eu vi recentemente um fórum Debian que mencionou frames de pausa deve ser descartado pela camada MAC e se não o driver deve descartá-los. Isso é verdade? Como um host realmente reduz o tráfego se receber um quadro de pausa de um switch?
Eu estou tentando obter uma melhor compreensão do controle de fluxo de Ethernet. Se a afirmação acima for verdadeira, o que é passado para o host realmente significa?
Existem três maneiras de lidar com o controle de fluxo:
Se você está sobrecarregado, você coloca os dados no chão.
Se você não puder fornecer o serviço para uma solicitação de uma camada superior, geralmente porque sua fila local está cheia, você retorna um erro para essa camada superior.
Você notifica proativamente as camadas superiores que elas precisam diminuir.
Na camada Ethernet, o método 3 é suportado através de quadros de pausa. Muitas vezes, camadas mais altas não suportam o método 3, mas suportam o método 2. Quando uma camada tem uma camada abaixo que suporta o método 3, mas a camada acima só suporta o método 2, ela pode parar de passar dados temporariamente para camadas inferiores, causando o método 2 para aplicar em camadas superiores.
Ou, para colocar de forma mais concreta, quando você recebe um quadro de pausa, interrompe o mecanismo de envio e configura um cronômetro para reiniciar o mecanismo de envio no tempo apropriado. Enquanto o mecanismo de envio estiver parado, suas filas locais serão preenchidas com dados das camadas superiores. Se eles ficarem cheios, você retorna erros "ocupados" para as camadas superiores e eles lidam com isso, no entanto, é apropriado.
Então, como um quadro de pausa é enviado para a pilha e, por sua vez, o NIC diminui o tráfego de envio? Os controladores ethernet Eu tenho controle de fluxo de suporte, mas não consigo determinar porque o tráfego não "pausa".
user_ABCD
4
O quadro de pausa não é enviado para a pilha. A camada baixa da pilha simplesmente pára de ler quadros da fila. Quando a fila fica cheia, as camadas superiores detectam isso quando suas funções "adicionar pacote à fila" falham. (Leia o último parágrafo)
David Schwartz
Eu sou muito novo em tudo isso, mas se eu entendi corretamente, o que me faz parar de ler quadros da fila? Usando o ethtool, posso ver que estou recebendo quadros de pausa do switch. Mas meu aplicativo udp nunca diminui em relação a um bps.
user_ABCD
1
Eu não sei o específico do seu aplicativo UDP (e plataforma), mas normalmente é qualquer mecanismo que lidaria com o caso em que não havia quadros de pausa. Como você também pode sobrecarregar links não locais e não Ethernet, não é possível confiar em quadros de pausa para o ritmo de transmissão UDP, e geralmente não faz sentido criar dois mecanismos. Se a sua plataforma propaga as informações até o espaço do usuário, você normalmente a detecta porque sendto em um soquete UDP sem bloqueio retornaria uma indicação "bloquearia".
David Schwartz
Hmmm Tenho certeza que entendi você. Existe uma boa maneira de determinar se estou lidando com os quadros de pausa? Duas coisas que eu sei atualmente são que estou recebendo frames de pausa (ethtool) e throughput (wireshark) nunca parece mudar. Quase como camadas mais altas nunca fazem nada quando recebo quadros de pausa.
user_ABCD
3
O controle de fluxo de Ethernet, até agora, tem sido um experimento falho, porque geralmente causa bloqueio de cabeça de linha problemas. Os switches não devem enviar quadros de pausa para hosts. Acredito que os switches da Cisco não podem ser configurados para enviar quadros de pausa; ativar o controle de fluxo Ethernet em um switch Cisco faz com que ele respeite os quadros de pausa que recebe. Os hosts são sábios para ignorar quadros de pausa recebidos.
Se a chave não puder manipular a transmissão, ela deve soltar o quadro. Camadas mais altas, mais notavelmente o TCP, usam quadros ignorados para saber quando ocorreu o congestionamento e quando recuar. Falha ao descartar quadros faz com que o TCP Congestion Control falhe, normalmente resultando em bufferbloat .
Por que um switch não deve enviar quadros de pausa? Eu tenho um switch netgear que os envia para hosts. Como um host informa a outro host para diminuir a velocidade?
user_ABCD
@ user_ABCD Read up on bloqueio de cabeça de linha . Imagine um switch conectado a um servidor GigE, um cliente GigE e um cliente 100Mbps, e ambos os clientes estão baixando do servidor. O buffer de entrada do comutador do servidor pode ser preenchido porque os pacotes não podem ser enviados para o cliente de 100 Mbps com rapidez suficiente. Em seguida, o switch envia um quadro de pausa para o servidor, prejudicando o cliente GigE. Acontece que é melhor lidar com o congestionamento simplesmente derrubando quadros na camada Ethernet, o que permite que as camadas superiores descubram quando desacelerar.
Spiff
Isso não responde realmente o que acontece quando pausar quadros está usava...
grawity
@Spiff está sugerindo que, quando o buffer de entrada de um comutador estiver cheio, ele enviará quadros de pausa para todas as portas com o controle de fluxo ativado? Essencialmente abrandar toda a rede?
user_ABCD
@user_ABCD Não, apenas a porta do servidor no meu exemplo. Se um comutador tiver buffers de entrada por porta separados em cada porta e o buffer de entrada na porta do servidor está cheio por causa do cliente lento, o switch pode enviar um quadro de pausa para apenas o servidor , o que impede que o servidor atenda a outros clientes, como o fast client.
sendto
em um soquete UDP sem bloqueio retornaria uma indicação "bloquearia".O controle de fluxo de Ethernet, até agora, tem sido um experimento falho, porque geralmente causa bloqueio de cabeça de linha problemas. Os switches não devem enviar quadros de pausa para hosts. Acredito que os switches da Cisco não podem ser configurados para enviar quadros de pausa; ativar o controle de fluxo Ethernet em um switch Cisco faz com que ele respeite os quadros de pausa que recebe. Os hosts são sábios para ignorar quadros de pausa recebidos.
Se a chave não puder manipular a transmissão, ela deve soltar o quadro. Camadas mais altas, mais notavelmente o TCP, usam quadros ignorados para saber quando ocorreu o congestionamento e quando recuar. Falha ao descartar quadros faz com que o TCP Congestion Control falhe, normalmente resultando em bufferbloat .
fonte