Aula 17 - Arquitetura de Roteamento e Subredes CIDR 🌐
Objetivo Pedagógico
Objetivo: Compreender a divisão e agregação de redes IPv4/IPv6 usando máscara de comprimento variável (VLSM), notação CIDR e os algoritmos de roteamento dinâmico (OSPF, BGP).
📑 1. Fundamentos Teóricos & Análise Técnica
A camada de rede (Camada 3 do modelo OSI / Camada de Internet do modelo TCP/IP) tem como missão fundamental o encaminhamento e roteamento de pacotes fim a fim através de múltiplos enlaces heterogêneos.
A evolução do endereçamento IP substituiu as classes legadas (A, B, C) pela especificação Classless Inter-Domain Routing (CIDR - RFC 1519) e Variable Length Subnet Masking (VLSM): 1. Notação CIDR e Prefix Length: Representada por um prefixo /n, onde \(n\) indica a quantidade exata de bits dedicados à rede (network ID), restando \(32 - n\) bits para hosts. Uma sub-rede /24 disponibiliza \(2^{32-24} - 2 = 254\) endereços úteis, reservando o endereço base para identificação de rede e o endereço de host máximo para broadcast. 2. Supernetting e Route Aggregation: Permite sumarizar múltiplos blocos contíguos em uma única entrada de tabela de roteamento, reduzindo drasticamente o consumo de memória das tabelas de roteamento na Default Free Zone (DFZ) global da Internet. 3. Algoritmos e Protocolos de Roteamento: - Interior Gateway Protocols (IGP): Destacam-se o OSPF (Open Shortest Path First) e o IS-IS, fundamentados no algoritmo de Dijkstra (Link-State), convergindo rapidamente em topologias corporativas fechadas. - Exterior Gateway Protocols (EGP): O BGP (Border Gateway Protocol), protocolo de vetor de caminhos (Path-Vector), governa a troca de rotas entre Sistemas Autônomos (AS) globais com base em políticas administrativas e atributos AS-Path.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
Client["Host Origem (192.168.1.50/24)"] --> RouterA["Roteador de Borda AS100 (Gateway)"]
RouterA --> CIDR["Decisão de Roteamento Longest Prefix Match"]
CIDR --> OSPF["Domínio OSPF (Área 0 Backbone)"]
CIDR --> BGP["BGP Inter-AS (Sessão eBGP AS100 -> AS200)"]
BGP --> RouterB["Roteador AS200 (10.0.0.1/16)"]
RouterB --> Dest["Host Destino (10.0.4.12)"]
style Client fill:#e1f5fe,stroke:#01579b
style RouterA fill:#fff3e0,stroke:#e65100
style BGP fill:#f3e5f5,stroke:#7b1fa2
style Dest fill:#e8f5e9,stroke:#2e7d32 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Longest Prefix Match (LPM): Mecanismo pelo qual os roteadores selecionam a rota com a máscara mais específica na tabela de encaminhamento. - Hierarquia OSPF em Áreas: Redução do flooding de Link State Advertisements (LSAs) através do particionamento em Backbone Area 0 e áreas satélites. - Convergência e Métricas BGP: Seleção de rotas orientada por Weight, Local Preference, AS-Path prepend e Multi-Exit Discriminator (MED). - Transição IPv6: Endereçamento de 128 bits, eliminação de broadcast (substituído por multicast solicited-node) e suporte a SLAAC.
🛠️ 2. Implementação Prática em Redes de Computadores e Roteamento IP
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// cidr_calculator.py (Cálculo de Sub-redes CIDR e Tabela de Roteamento em Python)
import ipaddress
def calculate_subnet_plan(network_cidr: str, required_subnets: int):
"""Calcula a subdivisão VLSM de um bloco CIDR."""
base_net = ipaddress.ip_network(network_cidr, strict=True)
# Determina bits adicionais necessários para as sub-redes
import math
additional_bits = math.ceil(math.log2(required_subnets))
new_prefix = base_net.prefixlen + additional_bits
if new_prefix > 30:
raise ValueError("Bloco de rede insuficiente para as sub-redes solicitadas")
subnets = list(base_net.subnets(new_prefix=new_prefix))
print(f"=== Planejamento de Subredes: {network_cidr} -> /{new_prefix} ===")
for idx, sub in enumerate(subnets[:required_subnets]):
usable_hosts = list(sub.hosts())
print(f"Sub-rede #{idx+1}: {sub.network_address}/{sub.prefixlen}")
print(f" Máscara de Rede : {sub.netmask}")
print(f" Faixa Utilizável: {usable_hosts[0]} - {usable_hosts[-1]} ({len(usable_hosts)} hosts)")
print(f" Broadcast : {sub.broadcast_address}\n")
if __name__ == '__main__':
calculate_subnet_plan("10.100.0.0/16", required_subnets=4)
💡 Análise Passo a Passo do Código
- Módulo Nativo
ipaddress: Garante cálculos matemáticos exatos de máscaras binárias sem arredondamento errôneo. - Cálculo Dinâmico de Prefixo: Computa o expoente de potência de dois para acomodar a quantidade requisitada de domínios de colisão/broadcast.
- Separação Rigorosa de IPs Úteis: Garante o isolamento do endereço de rede (.0) e broadcast (.255 no caso /24) para integridade da camada 3.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto