NACK vs. ACK? Quando usar um sobre o outro?


19

Pessoalmente, nem sinto que haja necessidade de ACK. É mais rápido se apenas enviarmos NACK (n) para os pacotes perdidos em vez de enviar um ACK para cada pacote recebido. Então, quando / quais situações alguém usaria ACK sobre NACK e vice-versa?


Você poderia nos dar um pouco mais de contexto sobre o que está falando? Você está perguntando genericamente, ou sobre TCP, ou ??
Mike Pennington

Uma questão geral de rede não relacionada ao TCP, UDP ou qualquer outra área específica.
NFu9DT

Respostas:


29

O motivo do ACK é que um NACK simplesmente não é suficiente. Digamos que eu lhe envie um fluxo de dados de segmentos X (digamos 10 por simplicidade).

Você está com uma conexão ruim e recebe apenas os segmentos 1, 2, 4 e 5. Seu computador envia o NACK para o segmento 3, mas não percebe que deve haver segmentos 6 a 10 e não NACK.

Então, reenvio o segmento 3, mas meu computador acredita falsamente que os dados foram enviados com êxito.

Os ACKs garantem que o segmento chegou ao destino.

Se você deseja que o aplicativo lide com a ordem dos dados e retransmissões, você pode simplesmente optar por utilizar um protocolo como o UDP (por exemplo, como o TFTP).


Boa resposta. Mas não poderíamos simplesmente designar o primeiro pacote como um pacote especial - incluiria o número de segmentos que enviaria.
Hari

4
Isso ainda deixa o problema do remetente sem saber se os dados são recebidos. Sem ACK no processo, se o remetente não ouvir nada, basta assumir que todos os dados foram recebidos, mesmo que todo o fluxo de dados tenha sido perdido. O ACK garante que os dados foram recebidos.
YLearn

4

Tudo se resume à distribuição de probabilidade de perda e padrão de tráfego.

Tomemos, por exemplo, um link sem fio típico, com uma taxa de perda constante de 10 a 30%. Se você confirmar cada quadro recebido (como 802.11abg), detectará rapidamente quando um quadro foi perdido, para não perder tempo para esperar um tempo limite.

Se você preferir NAK, ficará dependente do padrão de tráfego: - Se você enviar um único pacote de solicitação e esperar uma resposta, e essa solicitação for perdida, você terá que ter um tempo limite expirado se não receber uma resposta. responda. - Se você está apenas enviando um fluxo de pacotes a um destinatário quase mudo, é aceitável receber apenas um NAK quando o destinatário receber o próximo pacote. Mas isso significa que o destinatário precisa reordenar pacotes e que o remetente deve acompanhar um grande estoque de mensagens que ele enviou.

(adivinhe qual solução 802.11n escolhe? ambos. O receptor envia um bitmap de tamanho variável dos quadros que recebeu)

Agora, adote uma rede típica da Internet: você tem quase 0% de perda de pacotes, até que algo ruim aconteça, e você tem uma perda de quase 100% de pacotes por um certo tempo, seguindo alguma lei de distribuição exponencial, de uma interrupção de 200ms a um minuto e uma metade.

A aceitação de cada pacote pareceria inútil em uma rede sem perdas, até que você considere o caso em que o link é interrompido: você não receberá ACK ou NACK por um período possivelmente maior e o destinatário normalmente não enviará nada até o link é restaurado.

Se você usar o ACK, o remetente interromperá o envio e manterá a lista de pendências até que o link seja restaurado. Se você usar o NACK, o destinatário poderá dizer-lhe que não recebeu o pacote que caiu da lista de pendências do remetente há muito tempo e que a conexão é essencialmente irrecuperável.


1

Os ACKs são úteis em protocolos de janelas deslizantes, permitem que o transmissor A saiba que os dados enviados foram recebidos pelo controle remoto B. O transmissor A pode então continuar enviando os próximos dados - até que a janela de transmissão esteja cheia (de dados enviados ao controle remoto, mas ainda não reconhecido).

Os ACKs podem ser considerados mais essenciais que os NAKs. Os NAKs simplesmente permitem uma recuperação mais rápida , no caso em que um pacote / bloco enviado por A não é recebido por B, e B detecta de alguma forma que um pacote / bloco está ausente.

É perfeitamente viável projetar um protocolo que suporte transferência confiável e controle de fluxo somente com ACK, sem NAK (com retransmissão pelo transmissor no caso de o transmissor não receber um ACK, mecanismo de retransmissão necessário em qualquer caso).


0

Uma coisa mais importante que eu gostaria de adicionar aqui, no TCP, NÃO enviamos ACK para CADA PACOTE RECEBIDO.

No entanto, os ACKs são enviados apenas para o ÚLTIMO PACOTE RECEBIDO.

Por favor corrija-me se eu estiver errado.


1
Isso é verdade até certo ponto. Por exemplo, segmentos com apenas o sinalizador ACK ou RST definido não requerem um ACK. Além disso, se ACKs atrasadas estiverem em uso, pode não haver um ACK em todos os segmentos; no entanto, geralmente isso exige que um ACK seja enviado para todos os outros segmentos. No entanto, muitas conexões TCP não usarão ACKs com atraso e enviarão um ACK para todos os segmentos que transportam dados.
YLearn
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.