College Online
0%

Roteamento

Modulo 4 · Aula 2 ~25 min de leitura Nivel: Intermediario

Video da aula estara disponivel em breve

O que e roteamento?

Roteamento e o processo de determinar o caminho que um pacote deve seguir da origem ao destino, atravessando multiplos roteadores. Cada roteador mantém uma tabela de roteamento que indica, para cada destino, qual e o proximo salto (next hop).

Tabelas de roteamento

Diagrama
Exemplo de tabela de roteamento:

Destino          Mascara          Next Hop        Interface
──────────────   ──────────────   ────────────    ─────────
192.168.1.0      255.255.255.0    diretamente     eth0
10.0.0.0         255.0.0.0        192.168.1.1     eth0
0.0.0.0          0.0.0.0          192.168.1.254   eth0  (default)

Algoritmo de forwarding:
  1. Recebe pacote com IP destino
  2. Procura o "longest prefix match" na tabela
  3. Encaminha para o next hop correspondente
  4. Se nenhuma entrada corresponde: usa default route (0.0.0.0/0)

Algoritmos de roteamento

Link-state (estado de enlace)

Cada roteador conhece a topologia completa da rede. Usa o algoritmo de Dijkstra para calcular o caminho mais curto para todos os destinos.

Python
import heapq

def dijkstra(graph, start):
    """Algoritmo de Dijkstra para shortest path."""
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    previous = {node: None for node in graph}
    pq = [(0, start)]

    while pq:
        current_dist, current = heapq.heappop(pq)
        if current_dist > distances[current]:
            continue
        for neighbor, weight in graph[current].items():
            distance = current_dist + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                previous[neighbor] = current
                heapq.heappush(pq, (distance, neighbor))

    return distances, previous

# Topologia de rede (grafo ponderado)
network = {
    "R1": {"R2": 1, "R3": 4},
    "R2": {"R1": 1, "R3": 2, "R4": 6},
    "R3": {"R1": 4, "R2": 2, "R4": 3},
    "R4": {"R2": 6, "R3": 3},
}

dist, prev = dijkstra(network, "R1")
print("Distancias de R1:", dist)
# {'R1': 0, 'R2': 1, 'R3': 3, 'R4': 6}

Distance-vector (vetor de distancias)

Cada roteador conhece apenas seus vizinhos diretos e as distancias que eles anunciam. Usa o algoritmo de Bellman-Ford. Cada roteador envia sua tabela de distancias aos vizinhos periodicamente.

Referencia
Link-state vs Distance-vector:

                    Link-state          Distance-vector
──────────────     ──────────────      ──────────────
Conhecimento        Topologia completa  Apenas vizinhos
Algoritmo           Dijkstra            Bellman-Ford
Convergencia        Rapida              Lenta (count-to-infinity)
Mensagens           Floods LSAs         Envia tabela aos vizinhos
Protocolo real      OSPF, IS-IS         RIP, EIGRP
Escalabilidade      Melhor              Pior em redes grandes

Protocolos de roteamento reais

OSPF (Open Shortest Path First)

Protocolo link-state usado dentro de sistemas autonomos (intra-AS). Cada roteador envia LSAs (Link State Advertisements) para construir um mapa completo da rede.

BGP (Border Gateway Protocol)

Protocolo path-vector usado entre sistemas autonomos (inter-AS). E o protocolo que "cola" a Internet — cada AS anuncia quais prefixos IP pode alcancar. BGP e o protocolo mais critico da Internet.

Diagrama
        AS 1 (Google)          AS 2 (Amazon)
       ┌──────────────┐      ┌──────────────┐
       │  OSPF interno │      │  OSPF interno │
       │  R1──R2──R3   │      │  R4──R5──R6   │
       └──────┬───────┘      └──────┬───────┘
              │                      │
              └────── BGP ──────────┘
              (troca de rotas inter-AS)

BGP: "Eu (AS1) posso alcancar 172.217.0.0/16"
     "Eu (AS2) posso alcancar 54.239.0.0/16"

No harness.os

Python
# Tabela de roteamento harness.os: concern -> agent
# Funciona como uma routing table onde "destino" e o concern

routing_table = {
    "governance":    {"agent": "governance-agent",  "priority": 1},
    "security":      {"agent": "security-agent",    "priority": 1},
    "causal":        {"agent": "build-agent",       "priority": 2},
    "relational":    {"agent": "knowledge-agent",   "priority": 2},
    "metacognitive": {"agent": "meta-agent",        "priority": 3},
    "*":             {"agent": "general-agent",     "priority": 99},  # default route
}

def route_request(concern: str) -> str:
    """Roteia um request para o agente correto baseado no concern."""
    if concern in routing_table:
        return routing_table[concern]["agent"]
    return routing_table["*"]["agent"]  # default route

print(route_request("governance"))    # governance-agent
print(route_request("unknown"))       # general-agent (default)

Resumo

Exercicio pratico

Construa uma routing table para harness.os que mapeia concerns para agentes especializados.

  1. Liste todos os 5 concerns e o agente responsavel por cada um
  2. Adicione uma default route para concerns desconhecidos
  3. Implemente longest-prefix match: se concern e "security.mcp", match "security"
  4. Adicione metricas (latencia, custo) e escolha a melhor rota

Verifique seu entendimento

Qual algoritmo e usado pelo protocolo OSPF para calcular o caminho mais curto?

  • Dijkstra (shortest path first)
  • Bellman-Ford
  • Floyd-Warshall
  • Round-robin