De onde vêm os pacotes enviados somente para o ack (no FreeBSD)?

2

Eu corro o comando systat -tcp em um sistema moderadamente carregado e vejo algo assim para uma janela de 5 segundos:

                /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10
 Load Average   ||||||||||||

         TCP Connections                       TCP Packets
       0 connections initiated           21062 total packets sent
     153 connections accepted            16291 - data
     153 connections established           125 - data (retransmit by dupack)
      11 connections dropped                 1 - data (retransmit by sack)
       0 - in embryonic state             4271 - ack-only
       5 - on retransmit timeout             0 - window probes
       0 - by keepalive                    217 - window updates
       0 - from listen queue                 0 - urgent data only
                                           148 - control
                                             0 - resends by PMTU discovery
         TCP Timers                      21057 total packets received
    9752 potential rtt updates           13471 - in sequence
   12437 - successful                       49 - completely duplicate
     763 delayed acks sent                  11 - with some duplicate data
     140 retransmit timeouts                14 - out-of-order
       0 persist timeouts                  225 - duplicate acks
       0 keepalive probes                12535 - acks
       0 - timeouts                          0 - window probes
                                            80 - window updates
                                             0 - bad checksum

Por que o número somente de ack enviado é muito maior do que o número de "atrasos de envio enviados", além dos números recebidos dos dados de dup? Que situações geram pacotes somente ack além dos dados de entrada (que devem passar pelo timer de ack atrasado) e dupes recebidos (ack imediato). Keepalive, eu acho. Mas esta caixa não tem conexões ociosas de longa duração. Tudo é curto e furioso. E também há um item de linha keepalive que diz zero ...

O que estou perdendo sobre a máquina tcp aqui?

    
por cjp 02.12.2010 / 23:11

1 resposta

2

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.

    
por 03.12.2010 / 00:00