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?
protocol-theory
nFu9DT
fonte
fonte
Respostas:
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).
fonte
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.
fonte
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).
fonte
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.
fonte