O tamanho da janela TCP geralmente é independente do tamanho máximo do segmento, que depende da unidade máxima de transferência, que por sua vez depende do tamanho máximo do quadro .
Vamos começar de baixo.
O tamanho máximo de quadro é o maior quadro que uma rede (segmento) pode transportar. Para Ethernet, são 1518 bytes por definição.
O quadro encapsula um pacote IP, portanto, o maior pacote - a unidade máxima de transferência MTU - é o tamanho máximo do quadro menos a sobrecarga do quadro. Para Ethernet, isso é 1518 - 18 = 1500 bytes.
O pacote IP encapsula um segmento TCP; portanto, o tamanho máximo do segmento MSS é o MTU menos a sobrecarga de IP menos a sobrecarga de TCP (o MSS não inclui o cabeçalho TCP). Para Ethernet e TCP sobre IPv4 sem opções, isso é 1500 - 20 (sobrecarga de IPv4) - 20 (sobrecarga de TCP)) = 1460 bytes.
Agora, o TCP é um protocolo de transporte que se apresenta como um soquete de fluxo para o aplicativo. Isso significa que um aplicativo pode transmitir qualquer quantidade de dados arbitrariamente dimensionada nesse soquete. Para isso, o TCP divide o fluxo de dados nos referidos segmentos (de 0 a bytes MSS de comprimento {1}), transmite cada segmento por IP e os reúne novamente no destino.
Os segmentos TCP são reconhecidos pelo destino para garantir a entrega. Imagine que o nó de origem envie apenas um segmento, aguarde confirmação e, em seguida, envie o próximo segmento. Independentemente da largura de banda real, a taxa de transferência dessa conexão TCP seria limitada pelo tempo de ida e volta (RTT, o tempo necessário para um pacote viajar da origem ao destino e voltar novamente).
Portanto, se você tivesse uma conexão de 1 Gbit / s entre dois nós com um RTT de 10 ms, seria possível enviar 1.460 bytes a cada 10 ms ou 146 kB / s. Isso não é muito satisfatório.
O TCP, portanto, usa uma janela de envio - vários segmentos que podem estar "em vôo" ao mesmo tempo, sendo enviados e aguardando confirmação. Também é chamada de janela deslizante , pois avança cada vez que o segmento no início da janela é reconhecido, acionando o envio do próximo segmento para o qual a janela avançou. Dessa forma, o tamanho do segmento não importa. Com uma janela tradicionalmente de 64 KiB, podemos ter essa quantidade em voo e, portanto, transportar 64 KiB a cada 10 ms = 6,5 MB / s. Melhor, mas ainda não muito satisfatório para uma conexão de gigabit.
O TCP moderno usa a opção de escala de janela que pode aumentar exponencialmente a janela de envio para até 2 GiB, proporcionando algum crescimento futuro.
Mas por que todos os dados não são enviados de uma só vez e por que precisamos dessa janela de envio? Se você enviar tudo o mais rápido possível - localmente - e houver (muito provavelmente) um link mais lento em algum lugar no caminho para o destino, quantidades significativas de dados precisarão ser enfileiradas. Nenhum switch ou roteador pode armazenar em buffer mais do que alguns MB (se houver), portanto, o tráfego em excesso precisaria ser eliminado. Na falta de reconhecimento, seria necessário reenviar, o excesso sendo descartado novamente. Isso seria altamente ineficiente e congestionaria seriamente a rede. O TCP lida com esse problema com seu controle de congestionamento, ajustando o tamanho da janela de acordo com a largura de banda efetiva e o tempo atual de ida e volta em um algoritmo complexo.
{1} Segmentos vazios podem ser usados para impedir o tempo limite da conexão usando a opção keepalive . Thx Deduplicator