Camada de Rede e Algoritmos de Roteamento

A camada que liga redes diferentes e escolhe o caminho dos pacotes

Professor: Gabriel Soares Baptista

Introdução

Hoje você vai ver como a comunicação sai da LAN e passa por vários roteadores até chegar ao destino. Até aqui, o foco era o enlace local. Agora o problema é fim a fim.

A camada de rede existe para entregar pacotes entre redes diferentes e escolher o caminho até o destino.

Ideia central

A camada de rede conecta enlaces locais em comunicação fim a fim, combinando encaminhamento de pacotes com algoritmos de roteamento.

Quando o problema deixa de ser local

Imagine dois computadores em redes diferentes. Entre eles, há vários roteadores intermediários.

O switch local já não resolve tudo. Ele encaminha quadros na LAN. Quando o destino está fora da rede local, alguém precisa decidir o próximo salto. Esse papel é da camada de rede.

Falta uma visão de caminho entre redes. Por isso, a unidade central aqui passa a ser o pacote, que atravessa vários enlaces até o host correto.

O ambiente da camada de rede

A camada de rede é a primeira que trata da transmissão de origem até destino. No caminho, vários roteadores recebem o pacote, analisam e repassam adiante.

Esse funcionamento é chamado de store-and-forward. O pacote chega, é armazenado, verificado e só então segue para o próximo salto.

Por que armazenar antes de encaminhar

O roteador não é um fio transparente. Ele precisa receber o pacote, checar a integridade e decidir o que fazer com ele.

Isso também explica as filas, os atrasos e as decisões locais de encaminhamento em cada roteador.

Exemplo 1

Considere o caminho abaixo:

$$ Host\ A \rightarrow R_1 \rightarrow R_2 \rightarrow R_3 \rightarrow Host\ B $$

O pacote não aparece direto em Host B. Ele passa por decisões locais sucessivas.

  1. Host A entrega o pacote ao roteador R_1.
  2. R_1 identifica o destino e escolhe R_2.
  3. R_2 repete o processo e encaminha para R_3.
  4. R_3 entrega o pacote ao host final.

Cada roteador decide localmente, mas o conjunto das decisões produz o caminho completo.

Que serviço a camada de rede oferece

Antes de rotear, precisamos saber o que a camada de rede promete para a camada de transporte.

O ideal é esconder a topologia interna da rede. A camada superior não deveria precisar saber quantos roteadores existem nem qual tecnologia está no meio.

Aqui surgem duas abordagens. Uma trata cada pacote de forma independente. A outra estabelece um caminho lógico antes da transferência.

Serviço não orientado a conexões

Cada pacote é tratado de forma independente. Ele carrega o destino e os roteadores decidem pacote a pacote.

Essa é a lógica dos datagramas. A comparação comum é com o sistema postal.

Serviço orientado a conexões

A rede primeiro estabelece um caminho. Depois disso, os pacotes seguem o circuito virtual criado.

A comparação clássica é com o sistema telefônico.

A diferença de ideia entre os dois modelos

No modelo de datagramas, a rede é mais simples e flexível. No de circuitos virtuais, a rede mantém mais estado sobre a conexão.

ServicosRedeorigemHost de origemredeCamada de redeorigem->rededatagramaDatagramasCada pacote decide o caminhorede->datagramacircuitoCircuito virtualCaminho lógico antes do enviorede->circuitodestinoHost de destinodatagrama->destinocircuito->destino

Datagramas e circuitos virtuais por dentro

Agora dá para olhar para a implementação dessas duas escolhas.

Rede de datagramas

Os pacotes são roteados de forma independente. Não há configuração prévia obrigatória.

Isso permite que dois pacotes da mesma comunicação sigam rotas diferentes, se a tabela mudar no meio do caminho.

Exemplo 2

Imagine que H1 envie quatro pacotes para H2.

  1. Os pacotes 1, 2 e 3 seguem por A -> C -> E -> F.
  2. Antes do pacote 4, A atualiza sua tabela.
  3. O pacote 4 passa a seguir por B.

Mesma comunicação, rota diferente. Isso é natural em uma rede de datagramas.

Rede de circuitos virtuais

O caminho é estabelecido antes do envio. Cada roteador mantém uma entrada para o circuito e encaminha com base nela.

Os pacotes carregam um identificador de circuito virtual, não o caminho completo a cada salto.

Exemplo 3

Suponha que H1 estabeleça uma conexão com H2.

  1. O caminho lógico escolhido é A -> C -> E -> F.
  2. A registra a saída correta para a conexão 1.
  3. C e E fazem o mesmo.
  4. Enquanto a conexão existir, os pacotes seguem essa rota lógica.

O ganho é previsibilidade. O custo é manter estado na rede.

Comparação direta

Aspecto Datagramas Circuitos virtuais
Preparação inicial Não exige configuração Exige estabelecimento prévio
Estado na rede Menor Maior
Caminho Pode variar por pacote Tende a ficar fixo
Reação a mudanças Mais flexível Mais dependente do circuito
Qualidade de serviço Mais difícil de garantir Mais fácil de planejar
Cuidado conceitual

Circuito virtual não é circuito físico dedicado. Ele é lógico.

O problema do roteamento

Agora a pergunta central é simples. Como os roteadores escolhem o caminho?

Os algoritmos de roteamento preenchem e atualizam tabelas para que cada roteador saiba qual interface usar quando um pacote chega.

Aqui vale separar duas ideias próximas.

  1. Encaminhamento é enviar o pacote pela interface correta.
  2. Roteamento é descobrir e manter as rotas.
Ideia prática

Encaminhamento é a decisão do momento. Roteamento é o cálculo que prepara essa decisão.

O princípio de otimização

O Tanenbaum apresenta o princípio de otimização. Se o roteador $J$ está no melhor caminho entre $I$ e $K$, então o melhor caminho de $J$ até $K$ também faz parte dessa rota ótima.

Isso mostra que os melhores caminhos formam uma estrutura em árvore, com raiz no destino. É a árvore de escoamento.

Por que essa ideia ajuda

Ela mostra que os caminhos ótimos não são aleatórios. Existe uma estrutura por trás, e os algoritmos tentam descobri-la.

Roteamento pelo caminho mais curto

Agora a rede vira um grafo. Cada roteador é um nó, cada enlace é uma aresta e cada aresta tem um custo. O problema vira encontrar o caminho de menor custo.

O que significa “mais curto”

Mais curto não é sempre menor distância física. Depende da métrica usada.

Se o custo for número de hops, o algoritmo favorece menos saltos. Se for atraso, pode preferir mais saltos, mas mais rápido.

Como o algoritmo de Dijkstra funciona

O Dijkstra constrói a resposta aos poucos. Ele mantém nós com custo confirmado e nós com custo provisório.

No início, a origem entra com custo zero. Os demais começam com custo infinito. Depois, o algoritmo escolhe o nó provisório de menor custo, fixa esse nó e relaxa as arestas que saem dele.

Relaxar significa testar se o novo caminho melhora o custo já conhecido. Se melhorar, atualizamos também o predecessor.

O predecessor guarda por onde o melhor caminho foi montado. No fim, seguimos esses predecessores de trás para frente.

Como o algoritmo de Dijkstra funciona

Vamos começar com um caso pequeno para ver os conjuntos sendo preenchidos com clareza.

DijkstraSmallAABBA--B2CCA--C1DDB--D3C--D5EEC--E2D--E1

Queremos sair de $A$ e chegar a $E$.

Passo 0: inicialização

$$ P = \{A\} $$

As distâncias começam assim:

Distância Predecessor Status
$A$ $0$ permanente
$B$ $\infty$ provisório
$C$ $\infty$ provisório
$D$ $\infty$ provisório
$E$ $\infty$ provisório

Relaxando as arestas de $A$:

$$ \begin{aligned} d(B) &= 2 \\ d(C) &= 1 \end{aligned} $$

Passo 1: menor provisório

$C$ entra em $P$.

$$ P = \{A, C\} $$

Relaxando as arestas de $C$:

$$ \begin{aligned} d(D) &= 6 \\ d(E) &= 3 \end{aligned} $$

Passo 2: novo menor provisório

Agora $B$ entra em $P$.

$$ P = \{A, C, B\} $$

Relaxando a aresta de $B$ para $D$:

$$ d(D) = 5 $$

Passo 3: destino resolvido

$E$ é o próximo menor provisório.

$$ P = \{A, C, B, E\} $$

Seguindo os predecessores:

$$ E \leftarrow C \leftarrow A $$

$$ A \rightarrow C \rightarrow E $$

$$ 1 + 2 = 3 $$

Outro exemplo

Agora a mesma lógica em um grafo maior.

DijkstraExampleAABBA--B2EEA--E1CCB--C7FFB--F3E--F2GGE--G6DDC--D3F--C4HHF--H2G--H1H--D2

Queremos sair de $A$ e chegar a $D$.

Passo 1

$$ d(A)=0 $$

Os demais nós começam com custo infinito.

$$ d(B)=d(C)=d(D)=d(E)=d(F)=d(G)=d(H)=\infty $$

$$ P = \{A\} $$

Passo 2

Os vizinhos imediatos de $A$ ficam com:

$$ \begin{aligned} d(B) &= 2 \\ d(E) &= 1 \end{aligned} $$

$E$ entra em $P$.

$$ P = \{A, E\} $$

Passo 3

Expandindo $E$:

$$ \begin{aligned} d(F) &= 3 \\ d(G) &= 7 \end{aligned} $$

$B$ ainda é o menor provisório.

$$ P = \{A, E, B\} $$

Passo 4

Expandindo $B$:

$$ \begin{aligned} d(C) &= 9 \\ d(F) &= 3 \end{aligned} $$

O caminho por $B$ não melhora $F$.

Passo 5

O próximo menor provisório é $F$.

$$ \begin{aligned} d(C) &= 7 \\ d(H) &= 5 \end{aligned} $$

Passo 6

Expandindo $H$:

$$ \begin{aligned} d(D) &= 7 \\ d(G) &= 6 \end{aligned} $$

Passo 7

O melhor caminho até $D$ é:

$$ A \rightarrow E \rightarrow F \rightarrow H \rightarrow D $$

com custo total:

$$ 1 + 2 + 2 + 2 = 7 $$

Flooding

No flooding, cada pacote recebido é reenviado por todas as interfaces de saída, exceto a de entrada.

É uma técnica ineficiente para tráfego comum, mas muito útil para entender robustez e duplicação.

Por que o flooding funciona

Ele não depende de uma visão sofisticada da topologia. Se houver caminho até o destino, a inundação tende a alcançá-lo.

O que precisa impedir o caos

Sem controle, o flooding gera cópias sem fim. Por isso, usa-se um contador de hops ou TTL e identificadores para reconhecer pacotes repetidos.

Exemplo 6

Suponha que A envie um pacote para D e a rede tenha três caminhos possíveis.

  1. A envia o pacote aos vizinhos.
  2. Cada vizinho reenviará às saídas, exceto à entrada.
  3. D pode receber várias cópias.
  4. A rede aceita uma cópia válida e ignora as demais.

O flooding é ruim como rotina, mas ótimo para perceber a diferença entre robustez e eficiência.

Roteamento por vetor de distância

No vetor de distância, cada roteador mantém a melhor distância conhecida até cada destino e o vizinho usado para alcançá-lo.

Em vez de conhecer toda a topologia, ele troca estimativas com os vizinhos e vai refinando a própria tabela.

A lógica básica

Se o roteador $J$ quer chegar a $X$, ele testa os vizinhos e calcula:

$$ d_J(X) = \min_V \{ c(J,V) + d_V(X) \} $$

Ou seja, soma o custo até o vizinho com o custo anunciado por esse vizinho até o destino e fica com a menor soma.

Considere que o roteador $J$ tenha três vizinhos e queira calcular a melhor rota até $G$.

$$ \begin{aligned} c(J,A) &= 8 \\ c(J,I) &= 10 \\ c(J,H) &= 12 \end{aligned} $$

Os vizinhos anunciam:

$$ \begin{aligned} d_A(G) &= 18 \\ d_I(G) &= 31 \\ d_H(G) &= 6 \end{aligned} $$

Continuação

Então $J$ calcula:

$$ \begin{aligned} \text{via } A &: 8 + 18 = 26 \\ \text{via } I &: 10 + 31 = 41 \\ \text{via } H &: 12 + 6 = 18 \end{aligned} $$

O menor valor é 18. Logo, o melhor caminho até $G$ passa por $H$.

O problema da contagem ao infinito

Quando uma rota desaparece, as boas notícias se espalham rápido, mas as más notícias podem demorar.

Considere a linha:

$$ A - B - C - D $$

Inicialmente, todos sabem chegar a A.

$$ \begin{aligned} d_B(A) &= 1 \\ d_C(A) &= 2 \\ d_D(A) &= 3 \end{aligned} $$

Agora o enlace entre A e B falha.

Primeira reação

B deixa de ver A, mas ouve C dizendo que ainda chega a A em 2 hops.

$$ d_B(A) = 3 $$

Próxima rodada

C ouve B dizendo que chega a A em 3 hops.

$$ d_C(A) = 4 $$

Rodadas seguintes

$$ 3, 4, 5, 6, \dots $$

Esse é o problema da contagem ao infinito.

Erro comum

O problema não é “fazer conta errada”. É informação incompleta, que faz cada roteador acreditar em uma rota que já não existe.

Próximos passos

Na próxima aula, você entra no protocolo que domina a Internet.

Vamos ver como o IP organiza endereçamento, formato de pacotes e interligação de redes.