Em 2004, o site deste autor, o nutzmann.net, tinha uma página que fazia uma pergunta e já trazia a resposta: quanto tempo um modem de "56k" leva para transferir um arquivo de "56k"? A ideia era o leitor responder um segundo e errar. O 56k do modem são 56 000 bits por segundo; o 56k do arquivo são 56 kilobytes de 1024 bytes, ou seja, 57 344 bytes, ou 458 752 bits; a resposta certa é pouco mais de oito segundos. Vinte e dois anos depois, o modem sumiu, mas o erro continua. Hoje ele aparece com links de gigabit e arquivos de gigabytes, na fatura de egress (o tráfego de saída) da nuvem e na janela de backup, e tem as mesmas três causas: bits contra bytes, prefixos decimais contra prefixos binários e a taxa nominal do link contra o que de fato chega à aplicação. Este artigo trata de uma causa de cada vez, e a calculadora de bits, bytes e vazão, que descende daquela página de 2004, faz a conta exata.

Bits para links, bytes para arquivos

Um byte tem oito bits, e cada uma dessas unidades tem o seu lugar, por uma convenção mais antiga do que a maioria das pessoas que a seguem. A velocidade de um link é dada em bits por segundo: uma porta de 100 Mbit/s, uma fibra de 1 Gbit/s, um modem de 56 000 bit/s (o título da própria recomendação ITU-T V.90 fala em "data signalling rates of up to 56 000 bit/s downstream and up to 33 600 bit/s upstream"). Já o tamanho de arquivo, a capacidade de disco e a memória são dados em bytes. Numa transferência, um volume medido em bytes passa por um link medido em bits, então em algum ponto da conta é preciso aplicar o fator oito; quando um download que "devia levar um minuto" leva oito, em geral foi esse passo que ficou de fora.

Os símbolos ajudam, desde que sejam respeitados: b minúsculo é bit e B maiúsculo é byte, então 100 Mb/s e 12,5 MB/s são a mesma velocidade. Datasheets e dashboards nem sempre respeitam essa regra, e é por isso que a calculadora, quando encontra um prefixo maiúsculo com b minúsculo (Kb, Mb), avisa que leu o valor em bits e que vale a pena conferir.

Os dois significados de quilo

É desta parte que saem os chamados no suporte. No Sistema Internacional de Unidades, quilo quer dizer 1000; mega, 1 000 000; giga, 10^9; e assim por diante. Um kilobyte, portanto, são 1000 bytes. Só que a memória do computador vem em potências de dois, e durante décadas se usou "kilobyte" para dizer 1024 bytes, porque 1024 é a potência de dois mais próxima de 1000, um costume que a página do sobre os prefixos registra. Os dois significados conviveram por décadas com o mesmo símbolo, e a diferença entre eles aumenta a cada prefixo: 2,4 % no quilo, 4,86 % no mega, 7,37 % no giga, 10 % no tera e 12,6 % no peta.

Em dezembro de 1998, a Comissão Eletrotécnica Internacional aprovou nomes e símbolos para os múltiplos binários, que saíram em janeiro de 1999 como IEC 60027-2, Emenda 2, e hoje fazem parte da IEC 80000-13: kibi (Ki, 2^10), mebi (Mi, 2^20), gibi (Gi, 2^30), tebi (Ti, 2^40), pebi (Pi, 2^50) e exbi (Ei, 2^60). A página do NIST sobre os prefixos diz com todas as letras que eles "are not part of the International System of Units ()" e que, no SI, "mega will mean 1 000 000". Um kibibyte são 1024 bytes e um kilobyte são 1000; um mebibyte são 1 048 576 bytes e um megabyte são 1 000 000. A página de 2004 já trazia um aviso: a calculadora usava "o padrão amplamente adotado pelo mercado, em vigor desde antes da nova regulamentação do IEC aprovada em 1998" e mudaria "quando o novo padrão for de fato adotado na prática". Essa prática nunca virou regra geral, e é por isso que uma calculadora de hoje precisa mostrar as duas leituras.

No dia a dia, a consequência é o disco que parece menor do que deveria. Um disco vendido como 1 TB guarda 1 000 000 000 000 bytes, que é o que o prefixo do fabricante quer dizer. Um sistema operacional que conta em potências de 1024 divide esse número por 2^40 e mostra 931; se ainda chamar o resultado de "GB" em vez de "GiB", o dono conclui que sumiram 69 GB. Não sumiu nada: o número só foi lido na outra convenção. As ferramentas que mostram tamanhos dizem qual convenção usam, se você perguntar: a página do ls do descreve a opção -h, --human-readable como a que mostra "sizes like 1K 234M 2G" e --si como "likewise, but use powers of 1000 not 1024"; e o argumento SIZE do mesmo comando lê K, M, G, T, P, E, Z, Y, R, Q como potências de 1024, KB, MB etc. como potências de 1000, e KiB como igual a K. Ou seja, para o mesmo programa, um K sozinho vale 1024 e um KB vale 1000; a calculadora lê um prefixo sozinho do mesmo jeito e deixa isso claro.

Taxa nominal versus payload

A terceira causa é mais sutil. Um link de 100 Mbit/s transmite 100 000 000 bits por segundo no fio, mas nem todos esses bits são do arquivo. Cada frame (quadro) leva um header e um trailer Ethernet, um preâmbulo e um inter-frame gap (o intervalo entre frames), um header IP e um header de transporte, e só o que sobra é payload, a carga útil. A , a metodologia de benchmarking para equipamentos de rede, registra esse custo do Ethernet no Apêndice C: no fio, um frame ocupa "Preamble 64 bits, Frame 8 x N bits, Gap 96 bits", onde N é o tamanho do frame do endereço de destino até o frame check sequence. No maior frame padrão, de 1518 bytes, isso dá 1538 bytes no fio, e a tabela do apêndice mostra que um link de 10 Mb/s carrega no máximo 812 desses frames por segundo: 10 000 000 dividido pelo produto de 1538 por 8.

Dentro do frame de 1518 bytes, o campo de payload, de 1500 bytes, leva o pacote IP; o header IPv4 tem no mínimo 20 octetos ( 791), e o header TCP, no mínimo 20 octetos (RFC 9293). A RFC 8200 junta as duas coisas numa frase, quando explica por que o no IPv6 é 20 octetos menor: no IPv4, o MSS é "the maximum packet size ... minus 40 octets (20 octets for the minimum-length IPv4 header and 20 octets for the minimum-length TCP header)", e no IPv6 é "minus 60 octets, because the minimum-length IPv6 header ... is 20 octets longer". Então, um segmento TCP cheio sobre IPv4 leva 1460 bytes de dados da aplicação em 1538 bytes de tempo no fio: 94,93 %. Sobre IPv6, são 1440 bytes, ou 93,63 %; com UDP sobre IPv4, cujo header tem 8 octetos (RFC 768), são 1472 bytes, ou 95,71 %. Por isso, um link de 100 Mbit/s entrega no máximo 11,87 MB/s de payload TCP, e não 12,5, e isso antes de descontar os ACKs, o slow start e qualquer perda. A calculadora oferece esses valores como presets de eficiência, mostra a conta e deixa você digitar qualquer outra porcentagem.

O exemplo resolvido, com a conta exata

A página de 2004 dizia "pelo menos 8,2 segundos". Com a conta exata: 56 KiB são 57 344 bytes, ou 458 752 bits; a 56 000 bits por segundo, isso dá 8,192 segundos. Se o mesmo arquivo for escrito como 56 kB, na leitura decimal, são 56 000 bytes, ou 448 000 bits: exatamente 8 segundos. Os 0,192 s que separam as duas respostas vêm só da diferença de 2,4 % entre os dois significados de quilo. O botão Exemplo da calculadora carrega este caso, e a tabela de conexões dela mostra o tempo do mesmo arquivo num canal ISDN de 64 kbit/s, num de 1 544 kbit/s, num de 2 048 kbit/s (as duas taxas que estão no título da ITU-T G.704) e em todas as velocidades de Ethernet que o IEEE 802.3-2022 especifica, de 10 Mb/s a 400 Gb/s, com as linhas que já existiam na tabela de 2004 devidamente marcadas.

Quatro hábitos que acabam com a discussão

  1. Escreva a unidade com a letra certa, maiúscula ou minúscula: b para bits, B para bytes, e o /s quando for uma taxa. "100 Mb" não é um tamanho.
  2. Escreva Ki, Mi, Gi quando quiser dizer potências de 1024, e leia k, M, G como potências de 1000, a não ser que o programa que mostra o valor diga outra coisa.
  3. Divida por oito antes de dividir pela taxa e, depois, divida pela eficiência da pilha de protocolos, e não por um.
  4. Quando a transferência for mais lenta do que a conta indica, desconfie da janela TCP e do round trip (o tempo de ida e volta) antes de desconfiar do link: a conta dá o teto, não a previsão.

Fontes