Roteamento
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
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.
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.
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.
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
# 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
- Roteamento: determinar o caminho de pacotes pela rede
- Tabelas de roteamento: destino -> next hop (longest prefix match)
- Link-state (Dijkstra): conhece toda a topologia, converge rapido
- Distance-vector (Bellman-Ford): so conhece vizinhos, converge devagar
- OSPF: intra-AS (dentro de uma rede), BGP: inter-AS (entre redes)
Exercicio pratico
Construa uma routing table para harness.os que mapeia concerns para agentes especializados.
- Liste todos os 5 concerns e o agente responsavel por cada um
- Adicione uma default route para concerns desconhecidos
- Implemente longest-prefix match: se concern e "security.mcp", match "security"
- 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?