MSS vs MTU

 

Quando fazemos download ou upload de algum arquivo, não paramos para pensar como ele está sendo efetivamente transferido. O filme de 1GB que você está baixando não é enviado para a sua máquina de uma vez, mesmo que a banda do seu link de internet permita que ele seja transferido quase que instantaneamente (sob nossa percepção). Diversos processos e ações estão sendo executados pelo seu computador e possíveis dezenas de outros dispositivos que fazem parte da comunicação.

 

Todo tráfego de rede é transferido em pedaços bem pequenos, os famosos ‘pacotes’, são dentro desses pacotes que os dados estão efetivamente sendo transferidos. Esses pacotes são gerados por cada dispositivo se comunicando entre si, porém como falamos, o computador não envia um ‘pacote gigante’ para o outro lado, é aí que o MTU e MSS entram.

 

MTU define quanto efetivamente de dados pode ser encapsulado em um frame ethernet ou pacote IP, ele é o tamanho máximo permitido do pacote incluindo os cabeçalhos e dados/payload.

 

MSS define quanto de dado/payload é possível ser enviado em cada pacote. Para ajudar no entendimento, o payload é o dado bruto sendo transferido de um lado para outro, no nosso exemplo, o payload de cada pacote é um fragmento do filme de 1GB.

 

Então fica claro que o MTU é um valor significante para a REDE, enquanto MSS é regido pelo protocolo TCP, os dois andam juntos, mas tem funções diferentes.

 

Se pegarmos uma interface ethernet como exemplo, normalmente o MTU padrão é de 1500 bytes, isso excluindo o cabeçalho ethernet e trailer. Isso quer dizer que a interface é incapaz de transferir pacotes onde a soma do payload mais os cabeçalhos sobrepassem 1500 bytes.

 

                                                                tcp-mtu-mss

 

Ainda na imagem acima, podemos ver que mesmo com MTU de 1500, o tamanho máximo do payload (dados) é de 1460, isso porque precisamos extrair dos 1500, 20 bytes do cabeçalho IP e 20 do cabeçalho TCP. Lembrando que para o TCP, 20 bytes é o tamanho mínimo do cabeçalho, podendo crescer dependendo da quantidade de informação que ele está carregando.

 

Vamos ir um pouco mais a fundo e pegar alguns exemplos, para isso nós utilizaremos a aplicação ‘Wireshark’.

 

 

Olhando o print apresentado abaixo podemos ver uma captura de pacote, de uma comunicação entre dois IPs, 192.168.43.128 e 192.168.150.130, para referência, ambos são máquinas virtuais rodando Windows 7 (I know 😐).

 

                               

 

 

Vamos desconsiderar todos as colunas exceto ‘length’ (comprimento/tamanho), essa coluna mostra exatamente o tamanho do pacote, como podemos ver, cada pacote possui um tamanho que é a soma de todos os dados dentro dele, mas como os computadores sabem quanto de dado podem inserir no payload?

 

 

                           

 

Logo no início da comunicação entre dois dispositivos, no pacote SYN (TCP 3-way handshake), o originador da comunicação envia qual o tamanho máximo de seu payload, no caso, quanto o outro lado pode inserir de dados no payload, no exemplo acima podemos ver que o valor é 1460 bytes. Esse é o MSS.

 

Resumindo, o dispositivo que está iniciando a sessão notifica que o seu MSS máximo é de 1460 bytes. Esse valor é variável e depende de diversos fatores, como SO, limitações locais, algum dispositivo no meio do caminho manipulando esse valor.

 

Não é apenas o originador que informa qual o seu MSS, a ponta B também informa qual seu MSS, pois a comunicação é bi-direcional e ambos os lados precisam saber quanto de dados podem encapsular em cada pacote que está enviando.

 

Para esclarecer algumas dúvidas que possam ter surgido durante esse tópico, em outro artigo falarei um pouco sobre fragmentação e problemas causados por mismatches entre MTU e MSS.