Pular para conteúdo

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

  1. Módulo Nativo ipaddress: Garante cálculos matemáticos exatos de máscaras binárias sem arredondamento errôneo.
  2. 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.
  3. 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