Você parece estar raciocinando que os pacotes apenas de confirmação só devem ser enviados quando a máquina obtiver um dupe, ou quando o temporizador expirar, mas não vejo por que isso seria verdade. Existe outra categoria, talvez mais comum e importante que qualquer uma delas, que é que a janela do ack está quase cheia.
Se a outra máquina estiver transmitindo dados para você e enviar pacotes suficientes para se aproximar da janela ack, a máquina local enviará uma confirmação. No caso comum em que não há outros dados para enviar, ele enviará um pacote somente de confirmação.
Então, por que existem alguns atrasos? Porque não queremos reconhecer todos os pacotes que o cliente envia: isso geraria um tráfego excessivo.
Suponha que a janela de recepção permita 10 pacotes de entrada. A máquina remota nos envia um. Não há necessidade de acertar imediatamente, porque eles sabem que podem nos enviar até mais 9. Se eles de fato continuarem enviando pacotes, então, quando estivermos próximos de preencher a janela, reconheceremos suas transmissões.
Por outro lado, se eles nos enviarem apenas um pacote, e então pararem por um tempo, nós queremos pelo menos reconhecer que temos aquele pacote, para que eles não o retransmitam e assim eles sabem o atual estado da janela.
O temporizador de confirmação atrasada faz uma distinção entre esses dois casos: permitir que eles continuem se enviarem muitos dados, sem deixar que os dados permaneçam não reconhecidos por muito tempo.