Para que serve o subnetting

Quase nunca o que você quer é uma única rede grande. Subnetting, a divisão em sub-redes, é pegar um bloco de endereços e dividi-lo em vários blocos menores, as sub-redes. Cada sub-rede pode ser um domínio de broadcast separado, um limite de segurança ou um segmento físico. Num campus, cada prédio pode ter a sua sub-rede; numa conta de nuvem, cada camada (tier) de uma aplicação pode ter a sua.

Os motivos são os mesmos desde que a prática virou padrão. A especificação de 1985 lista todos eles, sem rodeios: "Different technologies" (tecnologias diferentes) num mesmo local; os "Limits of technologies", porque "Most technologies impose limits, based on electrical parameters, on the number of hosts connected, and on the total length of the cable"; e "Network congestion", porque "It is possible for a small subset of the hosts on a LAN to monopolize most of the bandwidth" (RFC 950, seção 1). Troque os limites do cabo pelo tamanho do domínio de broadcast e por uma política de firewall, e a lista continua descrevendo uma rede moderna.

O mecanismo é mais simples do que costuma parecer: fazer subnetting é pegar bits emprestados da parte de host e passá-los para a parte de rede.

De onde vieram as sub-redes

O IPv4 começou com três tamanhos fixos de rede. "There are three formats or classes of internet addresses": a classe A, com 7 bits de rede e 24 de "local address"; a classe B, com 14 e 16; e a classe C, com 21 e 8 (RFC 791, setembro de 1981). Cada organização recebia um número de rede, e todos os hosts, em todos os cabos dela, compartilhavam esse mesmo número.

Esse esquema não aguentou os primeiros campi grandes. Jeffrey Mogul, de Stanford, propôs as sub-redes da internet em outubro de 1984 (RFC 917), e o padrão veio em agosto de 1985: a 950, de Mogul e J. Postel, do ISI, "based on RFC-917". A RFC descreve a mudança como um terceiro nível. "The original view of the Internet universe was a two-level hierarchy": a internet e as suas redes. As organizações "have added a third level to the interpretation of Internet addresses. In this view, a given Internet network is divided into a collection of subnets" (RFC 950, seção 1).

A RFC 950 comparou cinco maneiras de marcar quais bits formam a sub-rede e escolheu a máscara: "we choose the address-mask scheme: it is the most flexible scheme, yet costs no more to implement than any other". Dois detalhes dessa primeira versão mudaram depois. Ela aceitava bits de sub-rede em qualquer posição, porque "they need not be adjacent in the address", embora recomendasse "that the subnet bits be contiguous and located as the most significant bits of the local address"; e partia do princípio de que cada rede teria um só tamanho de sub-rede: "the width of the <subnet-number> field is constant for a given network" (RFC 950, seção 2.1). A máscara contígua virou regra em todo lugar e hoje é escrita como tamanho de prefixo; já a regra do tamanho único deu lugar às sub-redes de tamanho variável.

A máscara e a decisão que o host toma com ela

O host usa a máscara para tomar uma decisão a cada pacote: o destino está na minha sub-rede, ou eu entrego o pacote a um roteador? A especificação de requisitos para hosts descreve o teste em detalhe. A máscara "is a 32-bit mask that selects the network number and subnet number fields"; "If the IP destination address bits extracted by the address mask match the IP source address bits extracted by the same mask, then the destination is on the corresponding connected network, and the datagram is to be transmitted directly to the destination host"; "If not, then the destination is accessible only through a gateway" (RFC 1122, seção 3.3.1.1).

Pegue um host com 192.168.1.70/26 (máscara 255.255.255.192). O endereço dele, com a máscara aplicada, dá 192.168.1.64.

DestinoDestino com a máscara aplicadaIgual a 192.168.1.64?Para onde o host envia
192.168.1.100192.168.1.64SimDireto ao destino, depois de resolver o endereço MAC dele
192.168.1.130192.168.1.128NãoPara o default gateway
8.8.8.88.8.8.0NãoPara o default gateway

Uma máscara errada quebra justamente essa decisão. Um host com a máscara curta demais para a própria sub-rede (com menos bits de rede do que deveria) ainda chega à internet, mas não alcança os servidores da sub-rede vizinha: ele acha que esses servidores são locais, manda requests do Address Resolution Protocol () que ninguém no segmento dele responde e nunca recorre ao roteador, a não ser que o roteador, por acaso, responda por eles com proxy ARP.

Como pegar bits emprestados

Comece com 192.168.1.0/24. O prefixo é 24, então sobram 8 bits livres para hosts, o que dá um único bloco de 256 endereços.

Agora suponha que você precise de quatro sub-redes separadas em vez de uma. Quatro é 2², então você precisa de mais 2 bits de rede. Pegue esses bits emprestados da parte de host: o prefixo passa de /24 para /26.

  • O /26 fixa 26 bits e deixa 6 livres → 64 endereços por sub-rede.
  • Quatro sub-redes desse tamanho cobrem exatamente o /24 original:
    • 192.168.1.0/26, endereços .0 a .63
    • 192.168.1.64/26, endereços .64 a .127
    • 192.168.1.128/26, endereços .128 a .191
    • 192.168.1.192/26, endereços .192 a .255

Repare no padrão: cada sub-rede tem 64 endereços, então cada uma começa num múltiplo de 64. É essa regra, a de que o bloco "começa num múltiplo do próprio tamanho", que mostra onde ficam os limites válidos de uma sub-rede. Um bloco tem de começar num endereço que seja múltiplo do seu tamanho; se não começar, não é um bloco (Classless Inter-Domain Routing) válido.

Como achar a sub-rede de qualquer endereço

A mesma regra responde à pergunta mais comum do dia a dia: dado um endereço e um prefixo, em que sub-rede ele está? Faça a conta no octeto em que a máscara deixa de ser 255.

  1. Escreva a máscara. /20 é 255.255.240.0: os dois primeiros octetos são fixos, e é no terceiro que fica o limite da sub-rede.
  2. Ache o tamanho do bloco (block size) nesse octeto: 256 menos o valor da máscara nele. Aqui, 256 − 240 = 16, então, no terceiro octeto, as sub-redes começam em 0, 16, 32, 48 e assim por diante.
  3. Ache o múltiplo igual ao valor do endereço, ou o primeiro abaixo dele. Em 172.16.45.200/20, o terceiro octeto é 45, que fica entre 32 e 47.
  4. Leia a resposta. A sub-rede é 172.16.32.0/20; o broadcast dela é o último endereço antes do bloco seguinte, 172.16.47.255; e os hosts vão de 172.16.32.1 a 172.16.47.254, ou seja, 2¹² − 2 = 4.094 endereços utilizáveis.

A calculadora CIDR faz a mesma conta para qualquer endereço e prefixo, e é um jeito rápido de conferir uma resposta feita à mão.

O trade-off entre sub-redes e hosts

Cada bit que você pega emprestado para a rede corta pela metade o número de hosts por sub-rede:

PrefixoSub-redes num /24Endereços em cadaHosts utilizáveis em cada
/241256254
/252128126
/2646462
/2783230
/28161614

Mais sub-redes significa menos hosts em cada uma. Boa parte do projeto de uma rede é escolher em que ponto dessa curva ficar: sub-redes suficientes para os seus segmentos, hosts suficientes em cada uma para os equipamentos que ficam nela e alguma folga para crescer.

A sub-rede zero e a sub-rede com todos os bits em 1

Livros mais antigos, e algumas provas, descontam duas sub-redes além dos dois endereços. Isso vem da RFC 950, segundo a qual "the values of all zeros and all ones in the subnet field should not be assigned to actual (physical) subnets" (RFC 950, seção 2.1). Ou seja: nem a primeira sub-rede, a sub-rede zero (subnet zero), nem a última, a all-ones, com todos os bits de sub-rede em 1, deviam ser usadas. O motivo era a ambiguidade no endereçamento classful, por classes: a primeira sub-rede de 172.16.0.0/16 tem o mesmo endereço da própria rede, e a última tem o mesmo endereço de broadcast que ela. A nota da Cisco sobre o assunto explica que o uso da sub-rede zero "was discouraged because of the confusion inherent with a network and a subnet with indistinguishable addresses" (Cisco, sub-rede zero e sub-rede all-ones).

Essa regra caiu. Uma tabela de tamanhos de sub-rede de 1995 já inclui as duas, seguindo a "practice for using all definable subnets", e diz o seguinte sobre a velha exclusão: "This practice is obsolete! Modern software will be able to utilize all definable networks" (RFC 1878). Nos roteadores Cisco, desde o IOS 12.0, vale o "ip subnet-zero enabled by default", e "Currently, the use of subnet zero and the all-ones subnet is generally accepted, and most vendors support their use" (Cisco, mesma nota). Portanto, um /24 dividido em /26 dá quatro sub-redes, e não duas.

Dois endereços reservados e duas exceções

Numa sub-rede comum, o primeiro endereço (todos os bits de host em 0) identifica a sub-rede, e o último (todos os bits de host em 1) é o broadcast dela; por isso, um bloco de 2ⁿ endereços tem 2ⁿ − 2 hosts. Dois prefixos fogem desse padrão, e de propósito:

  • /31, para links ponto a ponto. Um link entre dois roteadores precisa de dois endereços, mas um /30 gasta quatro com ele. A RFC 3021 propôs "to halve the amount of address space assigned to point-to-point links (common throughout the Internet infrastructure) by allowing the use of 31-bit subnet masks", e, num link assim, "the two addresses above MUST be interpreted as host addresses" (RFC 3021, dezembro de 2000).
  • /32, um único endereço, usado em rotas de host e em interfaces de loopback: um endereço, uma máquina.

Sub-redes de tamanho variável

As sub-redes de um mesmo bloco pai não precisam ter todas o mesmo tamanho, apesar do que a RFC 950 supunha. O (Open Shortest Path First), por exemplo, leva a máscara junto com cada rota, e por isso "Two different subnets of the same IP network number may have different sizes (i.e., different masks). This is commonly referred to as variable length subnetting" (RFC 2328, seção 1.1). Com o (variable-length subnet masking, a máscara de tamanho variável), você recorta uma sub-rede grande para o segmento que tem muitos hosts e sub-redes pequenas para os links ponto a ponto, tudo a partir do mesmo bloco pai. As regras continuam as de sempre: o tamanho de cada sub-rede é uma potência de dois, e cada uma começa num múltiplo do próprio tamanho, para que os blocos nunca se sobreponham. O artigo sobre VLSM explica o método, e um exemplo resolvido aplica esse método do começo ao fim.

Para lembrar

  • Subnetting é pegar bits de host emprestados para a rede: cada bit emprestado dobra o número de sub-redes e corta o tamanho de cada uma pela metade.
  • Uma sub-rede começa num múltiplo do próprio tamanho; no octeto que interessa, o tamanho do bloco é 256 menos o valor da máscara nesse octeto.
  • O host aplica a máscara ao próprio endereço e ao endereço de destino e compara os dois: se forem iguais, a entrega é direta; se forem diferentes, o pacote vai para o gateway.
  • A sub-rede zero e a sub-rede com todos os bits em 1 podem ser usadas; a regra contra elas está obsoleta.
  • Uma sub-rede comum tem 2ⁿ − 2 hosts; um link /31 tem dois, e um /32 tem um.

Fontes