Professor: Gabriel Soares Baptista
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.
A camada de rede conecta enlaces locais em comunicação fim a fim, combinando encaminhamento de pacotes com algoritmos de roteamento.
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.
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.
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.
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.
Host A entrega o pacote ao roteador R_1.R_1 identifica o destino e escolhe R_2.R_2 repete o processo e encaminha para R_3.R_3 entrega o pacote ao host final.Cada roteador decide localmente, mas o conjunto das decisões produz o caminho completo.
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.
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.
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.
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.
Agora dá para olhar para a implementação dessas duas escolhas.
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.
Imagine que H1 envie quatro pacotes para H2.
A -> C -> E -> F.A atualiza sua tabela.B.Mesma comunicação, rota diferente. Isso é natural em uma rede de datagramas.
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.
Suponha que H1 estabeleça uma conexão com H2.
A -> C -> E -> F.A registra a saída correta para a conexão 1.C e E fazem o mesmo.O ganho é previsibilidade. O custo é manter estado na rede.
| 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 |
Circuito virtual não é circuito físico dedicado. Ele é lógico.
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.
Encaminhamento é a decisão do momento. Roteamento é o cálculo que prepara essa decisã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.
Ela mostra que os caminhos ótimos não são aleatórios. Existe uma estrutura por trás, e os algoritmos tentam descobri-la.
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.
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.
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.
Vamos começar com um caso pequeno para ver os conjuntos sendo preenchidos com clareza.
Queremos sair de $A$ e chegar a $E$.
$$ P = \{A\} $$
As distâncias começam assim:
| Nó | 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} $$
$C$ entra em $P$.
$$ P = \{A, C\} $$
Relaxando as arestas de $C$:
$$ \begin{aligned} d(D) &= 6 \\ d(E) &= 3 \end{aligned} $$
Agora $B$ entra em $P$.
$$ P = \{A, C, B\} $$
Relaxando a aresta de $B$ para $D$:
$$ d(D) = 5 $$
$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 $$
Agora a mesma lógica em um grafo maior.
Queremos sair de $A$ e chegar a $D$.
$$ 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\} $$
Os vizinhos imediatos de $A$ ficam com:
$$ \begin{aligned} d(B) &= 2 \\ d(E) &= 1 \end{aligned} $$
$E$ entra em $P$.
$$ P = \{A, E\} $$
Expandindo $E$:
$$ \begin{aligned} d(F) &= 3 \\ d(G) &= 7 \end{aligned} $$
$B$ ainda é o menor provisório.
$$ P = \{A, E, B\} $$
Expandindo $B$:
$$ \begin{aligned} d(C) &= 9 \\ d(F) &= 3 \end{aligned} $$
O caminho por $B$ não melhora $F$.
O próximo menor provisório é $F$.
$$ \begin{aligned} d(C) &= 7 \\ d(H) &= 5 \end{aligned} $$
Expandindo $H$:
$$ \begin{aligned} d(D) &= 7 \\ d(G) &= 6 \end{aligned} $$
O melhor caminho até $D$ é:
$$ A \rightarrow E \rightarrow F \rightarrow H \rightarrow D $$
com custo total:
$$ 1 + 2 + 2 + 2 = 7 $$
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.
Ele não depende de uma visão sofisticada da topologia. Se houver caminho até o destino, a inundação tende a alcançá-lo.
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.
Suponha que A envie um pacote para D e a rede tenha três caminhos possíveis.
A envia o pacote aos vizinhos.D pode receber várias cópias.O flooding é ruim como rotina, mas ótimo para perceber a diferença entre robustez e eficiê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.
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} $$
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$.
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.
B deixa de ver A, mas ouve C dizendo que ainda chega a A em 2 hops.
$$ d_B(A) = 3 $$
C ouve B dizendo que chega a A em 3 hops.
$$ d_C(A) = 4 $$
$$ 3, 4, 5, 6, \dots $$
Esse é o problema da contagem ao infinito.
O problema não é “fazer conta errada”. É informação incompleta, que faz cada roteador acreditar em uma rota que já não existe.
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.