Mudanças entre as edições de "RED29004-Laboratórios"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 917: Linha 917:
 
#Fique monitorando o PC3 a tela parar de ser atualizada, aproximadamente 90 s.
 
#Fique monitorando o PC3 a tela parar de ser atualizada, aproximadamente 90 s.
 
#Pare os processos nos quatro PCs utilizando CTRL-C.
 
#Pare os processos nos quatro PCs utilizando CTRL-C.
 +
#Rode o Wireshark e abra o arquivo /home/aluno/lab/shared/pc4.cap.
 
#Baseado na Figura 3, no '''Graph 2''' altere o filtro para '''udp.port==2000''' e no '''Graph 3''' altere o filtro para '''tcp.port==2001'''. Salve o gráfico gerado.
 
#Baseado na Figura 3, no '''Graph 2''' altere o filtro para '''udp.port==2000''' e no '''Graph 3''' altere o filtro para '''tcp.port==2001'''. Salve o gráfico gerado.
 
[[Arquivo:TCPxUDP_Wireshark.png |thumb | 400px| Figura 3 - Captura de 2 fluxos de dados TCP e UDP]]
 
[[Arquivo:TCPxUDP_Wireshark.png |thumb | 400px| Figura 3 - Captura de 2 fluxos de dados TCP e UDP]]

Edição das 11h17min de 25 de setembro de 2018

Página principal da disciplina


Conceitos Parciais

Ferramentas básicas: Ping e Traceroute

Objetivos

  • Familiarização com a infraestrutura dos laboratórios de redes
  • Conhecer aplicativos para verificar os parâmetros do TCP/IP
  • Diagnosticar o atraso dos pacotes
  • Traçar rotas em redes TCP/IP

Conceitos introdutórios para uso do laboratório

A rede do laboratório em uso segue o modelo apresentado no diagrama da Figura 1.

Figura 1 - Diagrama da rede do laboratório

Roteiro de atividades

ifconfig

O aplicativo ifconfig pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do ifconfig, o comando mostra a configuração atual de cada interface de rede.

Consultar as páginas man ifconfig do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.


  1. Analisando os dados obtidos do seguinte exemplo ifconfig

eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da

         inet end.: 172.18.18.14  Bcast:172.18.63.255  Masc:255.255.192.0
         endereço inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Métrica:1
         pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0
         Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0
         colisões:0 txqueuelen:1000 
         RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)
         IRQ:18 

lo Link encap:Loopback Local

         inet end.: 127.0.0.1  Masc:255.0.0.0
         endereço inet6: ::1/128 Escopo:Máquina
         UP LOOPBACK RUNNING  MTU:65536  Métrica:1
         pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0
         Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0
         colisões:0 txqueuelen:0 
         RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) </syntaxhighlight>
    1. O sistema em questão possui duas interfaces de rede: eth0 e lo
    2. Link encap:Ethernet: Configuração da interface Ethernet 0 (primeira)
    3. Endereço de HW 64:51:06:1a:f3:da: É o endereço da placa de rede, camada 2
    4. inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0: Endereço IPv4 associado a interface, seu respectivo endereço de broadcast e mascara de rede
    5. endereço inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link: Endereço IPv6 de escopo local gerado por autoconfiguração
    6. UP BROADCAST RUNNING MULTICAST: Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos multicast
    7. MTU: 1500: Maximum Transfer Unit – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet
    8. Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc
    9. A interface lo: Qualquer tráfego que um computador envie em uma rede loopback é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é localhost. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.
  1. Agora utilize o comando ifconfig para verificar o estado de suas interfaces e responda:
    1. Quantas e quais interfaces de rede sua máquina possui? Liste.
    2. Qual o significado/utilidade da interface lo?
    3. Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?
    4. Quais são os endereços IPv4? De onde o sistema obteve esses endereços?
    5. Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo?

ping

Aplicativo ping permite a um usuário verificar se um host remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede. O ping está baseado no envio de mensagens de solicitação de eco (echo request) e de resposta de eco (echo reply). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.

O ping é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.

Consultar as páginas man do ping para verificar as possibilidades de uso deste aplicativo.

  1. Exemplo 1:

PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data. 64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms 64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms 64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms 64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms ^C --- 200.135.37.65 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms </syntaxhighlight>

    1. No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (icmp_seq), os quais foram recebidos com sucesso com o tempo de viagem assinalado (time)
    2. Cada pacote tem ainda um tempo de vida (ttltime to live), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede
    3. Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos
    4. O tempo de viagem (rttround trip time) mínimo (min), médio (avg) e máximo (max) é calculado, assim como o desvio padrão (mdev)
  1. Como exercício envie ping para diferentes hosts e compare e anote os tempos de resposta:
    1. no endereço local de loopback;
    2. máquina de um colega do laboratório;
    3. servidor e roteador da rede da escola;
    4. servidores externos:

www.ifsc.edu.br www.uol.com.br www.aaa.jp </syntaxhighlight>

  1. Explique as diferenças entre os tempos de resposta dos ping realizados:
    1. Entre ping para diferentes destinos.
    2. Entre respostas recebidas de um mesmo destino.
  2. Consulte as páginas man e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:
    1. -c count
    2. -i intervalo
    3. -s packetsize
    4. -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote.

traceroute

O traceroute é capaz de traçar uma rota aproximada entre dois hosts. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (time to live – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.

O traceroute envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.

  1. Exemplo:

sudo traceroute -I 200.135.37.65 traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets

1  192.168.1.1 (192.168.1.1)  0.225 ms  0.216 ms  0.368 ms
2  172.18.0.254 (172.18.0.254)  1.236 ms  1.235 ms  1.343 ms
3  hendrix.sj.ifsc.edu.br (200.135.37.65)  1.331 ms  1.313 ms  1.414 ms </syntaxhighlight> O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.2.1) e o servidor hendrix (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).
  1. Traçar a rota dos pacotes entre seu computador e diferentes hosts:
    1. máquina de um colega do laboratório
    2. servidor e roteador da rede da escola
    3. servidores americanos.
  2. Explique as diferenças entre os tempos de resposta:
    1. Entre traceroutes para diferentes destinos.
    2. No caso do traceroute para os EUA, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?
    3. Entre as três medidas apresentadas para cada salto.
    4. O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 13 um tempo de 289.207 ms e no salto 14 um tempo de 277.115 ms.
  3. Explique as linhas com o caracter *.

Ferramentas básicas: WireShark e tcpdump

2005 KUROSE, J.F & ROSS, K. W. Todos os direitos reservados

Objetivos

  • Conhecer aplicativos para verificar os parâmetros do TCP/IP
  • Familiarização com os sniffers de rede WireShark e tcpdump.

Introdução

O entendimento de protocolos de redes pode ser bastante aprofundado através da “observação de protocolos funcionando” e “da manipulação de protocolos” - observando a sequência de mensagens trocadas entre duas entidades, entrando nos detalhes da operação do protocolo, e fazendo com que os protocolos realizem certas ações e então observando estas ações e as consequências.

A ferramenta básica para observar as mensagens trocadas entre as entidades em execução é chamada de sniffer. Como o nome sugere, um sniffer captura mensagens sendo enviadas/recebidas pelo seu computador; ele também tipicamente armazena e/ou apresenta os conteúdos dos vários campos dos protocolos nestas mensagens capturadas. Um sniffer isoladamente é um elemento passivo. Ele observa as mensagens sendo enviadas e recebidas pelas aplicações e protocolos executando no seu computador, mas jamais envia pacotes. Similarmente, os pacotes recebidos nunca são explicitamente endereçados ao sniffer. Ao invés disso, um sniffer recebe uma cópia de pacotes que são enviados/recebidos para/de aplicações e protocolos executando no seu computador.

A Figura 1 mostra a estrutura de um sniffer. À direita da Figura 2 estão os protocolos (neste caso, protocolos da Internet) e aplicações (tais como navegador web ou cliente FTP) que normalmente executam no seu computador. O sniffer, exibido dentro do retângulo tracejado na Figura 2 é uma adição aos softwares usuais no seu computador, e consiste de duas partes: a biblioteca de captura de pacotes e o analisador de pacotes. A biblioteca de captura de pacotes recebe uma cópia de cada quadro da camada de enlace que é enviado do ou recebido pelo seu computador. Lembre que mensagens trocadas por protocolos das camadas mais altas tais como HTTP, FTP, TCP, UDP, DNS ou IP, são todos eventualmente encapsulados em quadros que são transmitidos para o meio físico como um cabo Ethernet. Na Figura 2, assume-se que o meio físico é uma Ethernet, e desta forma, os protocolos das camadas superiores são eventualmente encapsulados em um quadro Ethernet. Capturar todos os quadros fornece todas as mensagens enviadas/recebidas de/por todos os protocolos e aplicações executando em seu computador.

Figura 1 - Estrutura de um sniffer

O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. Por exemplo, suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. Nós utilizaremos o sniffer Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.

É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.

  • Analisando os campos da interface do Wireshark

Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura 3 aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais:

  1. Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus File e Capture. O menu File permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu Capture permite iniciar uma captura de pacotes;
  2. A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes;
  3. Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos;
  4. A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote;
  5. A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados;
  6. A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.
Figura 3 - Interface com o usuário do Wireshark

Roteiro de atividades

  1. Inicie o navegador web;
  2. Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso;
  3. Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces.
  4. Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4);
    Figura 4 - Interfaces de rede no Wireshark
  5. Basta clicar no botão Start da interface desejada para iniciar a captura de pacotes. Na Figura 4, como o Wireshark está sendo executado no Linux, o botão Start da interface eth0 deve ser selecionado;
  6. Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;
  7. No navegador, acesse o site http://www.ifsc.edu.br;
  8. Ao voltar para a janela do Wireshark, houve a captura de todos os pacotes envolvidos na conexão;
  9. Antes de continuar, vamos parar a captura de pacotes e trabalhar com o que temos. Basta clicar em Capture e depois em Stop;
  10. Para testar as capacidades de filtragem, vamos inserir a cadeia “http” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar Apply (ou Aplicar). Um resultado similar é exibido na figura 5;
    Figura 5 - Janela após a aplicação do filtro http
  11. Selecione a primeira mensagem HTTP exibida na janela de listagem de pacotes. Ela deve ser a mensagem HTTP GET que foi enviada do seu computador ao servidor HTTP em www.ifsc.edu.br. Quando você seleciona a mensagem HTTP GET, as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do segmento TCP e da mensagem HTTP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles.
  12. Se desejar acesse novos sítios e faça novas capturas e tente entender o que ocorre;
  13. Com Wireshark ativo (Abra-o novamente se necessário) acesse um sítio de sua preferência e responda às seguintes questões:
    1. Teste outros filtros, por exemplo, mostre somente pacotes originados e/ou destinados a um determinado host (ip.addr == 192.168...). Anote o filtro utilizado e salve a janela do mesmo. Exemplo de filtros.
    2. Elimine o filtro e anote os diferentes protocolos que aparecem na coluna Protocol na janela de listagem de pacotes;
    3. Quanto tempo passa entre o envio de uma mensagem HTTP GET até o recebimento de uma resposta OK? (por padrão, o valor da coluna Time na janela de listagem de pacotes é a quantidade de tempo, em segundos, desde que a captura iniciou). Para exibir o campo Time no formato hora do dia, selecione o menu View, depois Time Display Format, então selecione Time of day.
    4. Qual é o endereço IP do sítio navegado? Qual é o endereço IP da interface de rede do seu computador? Qual o endereço MAC de sua máquina?

Tcpdump

  1. Leia atentamente o manual do tcpdump , principalmente os exemplos: man tcpdump </syntaxhighlight>
  2. Faça um ping e navegue para algum site de sua preferência e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os em um arquivo denominado “pacotes_capturadosX.pcap“ (um arquivo para cada item X):
    1. Capture todos os pacotes oriundos e destinados à sua máquina.
    2. Idem anterior com a flag -vvv ativa e, em seguida, a flag -n.
      • Qual é a função dessas flags?
    3. Capture somente os pacotes oriundos de sua máquina.
      • Anote o comando utilizado.
    4. Capture somente pacotes destinados à sua máquina.
      • Anote o comando utilizado.
    5. Capture pacotes HTTP e DNS (lembre-se da porta de cada serviço).
      • Anote o comando utilizado.
  3. Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.
    1. Com qual programa foi aberto o arquivo?
    2. Exemplifique um possível uso dessa compatibilidade de arquivos?

Conceituando protocolos

Objetivos

  • Desenvolver o conceito de protocolo.
  • Entender o conceito de clientes e servidores de serviço.
  • Conceber um protocolo/serviço de calculadora pela rede.

Requisitos de um protocolo de camada de aplicação

  1. Os tipos de mensagens trocadas.
  2. A sintaxe dos vários tipos de mensagens, tais como os campos da mensagem e como os campos são delineados.
  3. A semântica dos campos, isto é, o significado da informação nos campos.
  4. Regras para determinar quando e como um processo envia mensagens e responde a mensagens.

Definição do protocolo a ser criado

  1. Vamos criar uma calculadora em rede através de um protocolo bem simples, utilizando como ferramenta de comunicação o ping e o Wireshark.

Estrutura Applicação

    1. O protocolo tem por objetivo dar suporte a uma calculadora em rede.
    2. Um aluno cria uma mensagem e envia, sem aviso prévio, a um colega. Este será o cliente da arquitetura cliente-servidor.
    3. O colega, ao receber a mensagem, deverá interpretá-la, elaborar uma resposta à pergunta e retorná-la ao colega. Este será o servidor da arquitetura cliente-servidor.
    4. A estrutura básica de um pacote que flui do cliente para o servidor e vice-versa é apresentada na figura abaixo. Essa estrutura deverá ser absolutamente respeitada, caso contrário, o servidor poderá não conseguir interpretá-la e descartará a mensagem.

Estrutura do Pacote

  • Onde Dst e Src são utilizados para identificar o nome do emissor e destinatário: as iniciais dos nomes.
  • O campo dados conterá a pergunta ou a reposta.

Roteiro

  1. Desative todas as atividades de rede de seu computador.
  2. Abra o wireshark e deixe capturando mensagens com o filtro icmp ativo.
  3. Cada estudante vai construir uma mensagem, respeitando o formato estabelecido, de solicitação (lado cliente). Essa mensagem deverá conter uma questão matemática, por exemplo: 2+2.
    1. Para construir a mensagem utilize o código ASCII: Tabela ASCII ou Tabela ASCII
  4. Envie essa mensagem a um ou vários colegas, sem aviso prévio, através do comando ping com a flag pattern. Ex: ping -p FF0200416C6C4F6469362D3103FF 192.168.1.1 </syntaxhighlight>
    • No relatório deverá estar contido a mensagem (Hexa) e sua interpretação.
  5. Ao receber uma mensagem no wireshark, interprete-a, (Ferramenta para conversão ASCII ==> Hexadecimal) verificando quem é o emitente e realizando a operação aritmética solicita.
    • No relatório deverá estar contido a mensagem (Hexa) e sua interpretação.
  6. Monte uma resposta e utilize o comando ping para responder ao emitente.
    • No relatório deverá estar contido a mensagem (Hexa) e sua interpretação.

Desvendando o HTTP com Wireshark

Fonte base: Wireshark - HTTP

Objetivos

  • Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.
  • Explorar vários aspectos do protocolo HTTP:
    1. a interação básica GET/resposta do HTTP.

A Interação Básica GET/Resposta do HTTP

  1. Vamos iniciar a nossa exploração do HTTP baixando um arquivo em HTML simples - bastante pequeno, que não contém objetos incluídos. Faça o seguinte:
    1. inicie o navegador;
    2. limpe o cache do mesmo (teclas de atalho para o Firefox: Ctrl + Shift + Del);
    3. inicie o Wireshark, como descrito no Ferramentas básicas;
    4. inicie a captura de pacotes;
    5. digite o seguinte URL no navegador http://tele.sj.ifsc.edu.br/~odilson/RED29004//RED29004.html;
    6. pare a captura de pacotes;
    7. digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).
      Fig.1 Requisição e Resposta HTTP
  2. O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:
    1. A mensagem GET (do seu navegador para o servidor web www.sj.ifsc.edu.br) e a mensagem de resposta do servidor para o seu navegador.
    2. A janela de conteúdos de pacotes mostra detalhes da mensagem selecionada (neste caso a mensagem HTTP GET /~odilson/RED29004//RED29004.html, que está em destaque na janela de listagem de pacotes).
    3. A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: RED29004! Página de teste.
  3. Responda às seguintes perguntas e imprima as mensagens GET e a resposta e indique em que parte da mensagem você encontrou a informação que responde às questões.
    1. O seu navegador executa HTTP 1.0 ou 1.1?
    2. Qual a versão de HTTP do servidor?
    3. Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?
    4. Qual o endereço IP do seu computador?
    5. E do servidor tele.sj.ifsc.edu.br?
    6. Qual o número da porta utilizada no seu computador?
    7. E do servidor tele.sj.ifsc.edu.br?
    8. Qual o código de status retornado do servidor para o seu navegador?
    9. Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?
    10. Quantos bytes de conteúdo são baixados pelo seu navegador?
    11. Encontre a mensagem RED29004! Página de teste. Onde (em qual campo) encontra-se?
    12. Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?

Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL

  1. Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:
    1. Coloque o Wireshark para capturar pacotes
    2. Abra um terminal de texto no Linux (menu Aplicativos->Acessórios->Terminal).
    3. Execute este comando:
      telnet tele.sj.ifsc.edu.br 80
      
    4. Após aparecer esta linha:
      Trying 200.135.37.75...
      Connected to integrado.sj.ifsc.edu.br.
      Escape character is '^]'.
      
      digite o seguinte:
      GET /~odilson/RED29004//RED29004.html HTTP/1.0
      
      e em seguida tecle ENTER duas vezes.
    5. Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?
    6. No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?
    7. Quanto tempo levou para fechar a conexão?
    8. Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?
  2. Refaça a conexão com o servidor:
    telnet tele.sj.ifsc.edu.br 80
    
    1. Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:
      GET /~odilson/RED29004//RED29004.html HTTP/1.1
      Host: tele.sj.ifsc.edu.br
      
      <Enter>/<Enter></syntaxhighlight>
    2. Quanto tempo levou para fechar a conexão?
  3. Refaça a conexão com o servidor:
    telnet tele.sj.ifsc.edu.br 80
    
    1. Refaça o pedido, mas agora utilizando o HTTP/1.1:
      GET /~odilson/RED29004//RED29004.html HTTP/1.1
      Host: tele.sj.ifsc.edu.br
      
      <Enter>/<Enter></syntaxhighlight>
    2. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:
      GET /~odilson/RED29004/RED29004_arq3.html HTTP/1.1
      Host: tele.sj.ifsc.edu.br
      
      <Enter>/<Enter></syntaxhighlight>
  4. O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1?
  5. Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?

Desvendando o HTTP com Wireshark, parte 2

Objetivos

  • Explorar vários aspectos do protocolo HTTP:
    1. formatos de mensagens HTTP,
    2. entender cookies,
    3. baixando arquivos grandes em HTML,
    4. baixando arquivos em HTML com objetos incluídos, e

A Interação HTTP GET Condicional/Resposta

  1. A maioria dos navegadores web tem um cache (seção 2.2.6 do livro) e, desta forma, realizam GET condicional quando baixam um objeto HTTP. Execute os seguintes passos:
    1. inicie o navegador web;
    2. limpe o cache do seu navegador (Ctrl + Shift + Del);
    3. inicie o Wireshark;
    4. digite o URL no navegador http://tele.sj.ifsc.edu.br/~odilson/RED29004//RED29004.html seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;
    5. pressione o botão “refresh” no navegador (ou digite o URL novamente);
    6. pare a captura de pacotes, e digite “http” na caixa de texto de especificação de filtro, para que apenas as mensagens HTTP sejam apresentadas na janela de listagem de pacotes.
  2. Responda às seguintes questões:
    1. Inspecione o conteúdo da primeira mensagem HTTP GET do seu navegador para o servidor tele.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?
    2. Inspecione o conteúdo da resposta do servidor. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?
    3. Agora inspecione o conteúdo da terceira mensagem HTTP GET do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?
    4. Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem?
    5. O servidor retornou explicitamente o conteúdo do arquivo? Explique.
    6. Qual o tamanho da primeira e terceira mensagem de retorno do servidor?

Cookies

  1. inicie o navegador web;
  2. limpe o cache do seu navegador;
  3. inicie a captura no Wireshark;
  4. digite o URL no navegador http://www.meuteste.net/cookies/, em seguida clique em HOME (canto superior esquerdo);
  5. pare a captura de pacotes, e digite "http and not ocsp" na caixa de texto de especificação de filtro, para que apenas as mensagens HTTP seja exibidas.
  6. Utilize o recurso de procura do Wireshark, exemplo na figura ao lado, e busque em Packet details pelas strings cookie e set-cookie
    Figura 1 - Filtro string cookie
  7. Você deve ter encontrado 1 ocorrência de set-cookie e várias de cookie, sempre com o mesmo número associado, explique o motivo explicando o comportamento do protocolo?
  8. inicie novamente a captura no Wireshark;
  9. digite o URL no navegador http://www.passarela.com.br/ e faça a busca pelo mesmo produto anterior;
  10. pare a captura de pacotes, e digite "http" na caixa de texto de especificação de filtro.
  11. Busque novamente as strings cookie e set-cookie. Analise.
  12. Os números são os mesmos do caso anterior?

Baixando Documentos Longos

Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria. Caso sua interface de rede não seja a eth0 adapte o comando, caso reiniciar a máquina repita-o: sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight>

  1. Nos exemplos até agora, os documentos baixados foram simples e pequenos arquivos em HTML. Vamos ver o que acontece quando baixamos um arquivo em HTML grande. Faça o seguinte:
    1. inicie o navegador web;
    2. limpe o cache do seu navegador;
    3. inicie o Wireshark;
    4. digite o URL no navegador http://tele.sj.ifsc.edu.br/~odilson/RED29004//RED29004_arq2.html seu navegador deve exibir um documento bastante longo e criativo :) ;
    5. Faça um atualização da página (F5);
    6. pare a captura de pacotes, e digite "http" na caixa de texto de especificação de filtro, para que apenas as mensagens HTTP seja exibidas.
  2. Na janela de listagem de pacotes, você deve ver a sua mensagem HTTP GET, seguida por uma reposta em vários pacotes. Esta resposta em vários pacotes merece uma explicação. Lembre-se da seção 2.2 do livro (veja a figura 2.9) que a mensagem de resposta HTTP consiste de uma linha de status, seguida por zero ou mais linhas de cabeçalhos, seguida por uma linha em branco, seguida pela carga útil (Content-Length). No caso do nossa HTTP GET, a carga útil na resposta é o arquivo HTTP completo. No nosso caso aqui, o arquivo em HTML é bastante longo, e a informação de 11747 bytes é muito grande para caber em um segmento TCP. A resposta HTTP simples é então quebrada em vários pedaços pelo TCP, com cada pedaço sendo contido dentro de um segmento TCP separado. Cada segmento TCP é capturado em um pacote separado pelo Wireshark, clique sobre o nono "Reassembled TCP Segments" no Wireshark.
  3. Responda às seguintes questões:
    1. Quantas mensagens HTTP GET foram enviadas pelo seu navegador?
    2. Quantos segmentos TCP foram necessários para carregar a resposta?
    3. Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.
    4. No segundo GET realizado, quantos segmentos TCP foram necessários para obtenção da resposta do servidor?
    5. O que explica a diferença entre a primeira e segunda requisições?

Documentos HTML com Objetos Incluídos

  1. Agora que vimos como o Wireshark mostra o tráfego capturado para arquivos em HTML grandes, nós podemos observar o que acontece quando o seu browser baixa um arquivo com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:
    1. inicie o navegador web;
    2. limpe o cache do seu navegador;
    3. inicie o Wireshark;
    4. digite o URL no navegador http://tele.sj.ifsc.edu.br/~odilson/RED29004/RED29004_arq3.html seu navegador deve exibir um arquivo pequeno em HTML com duas imagens incluídas. Estas duas imagens estão referenciadas no arquivo em HTML. Isto é, as imagens não estão no arquivo em HTML, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;
  2. digite o URL no navegador http://tele.sj.ifsc.edu.br/~odilson/RED29004/RED29004_arq4.html seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio do professor;
  3. pare a captura de pacotes, e digite “http” na caixa de texto de especificação de filtro, para que apenas as mensagens HTTP seja exibidas.
  4. Responda às seguintes questões:
    1. Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso?
    2. Para quais endereços na Internet estas mensagens foram enviadas em cada acesso?
    3. Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.

Serviço de Nomes (DNS)

Objetivos

O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:

  1. o lado cliente do DNS e
  2. uma pequena análise do protocolo

Lembre-se de que o papel do cliente no DNS é relativamente simples - um cliente envia uma consulta ao seu DNS, e obtém uma resposta. Muito pode acontecer “por baixo dos panos”, de forma invisível aos clientes DNS, enquanto os servidores DNS, organizados hierarquicamente, comunicam-se entre si para, ou recursivamente ou iterativamente, resolver uma consulta DNS de um cliente. Do ponto de vista do cliente DNS, contudo, o protocolo é bastante simples - uma consulta é feita ao seu servidor DNS e uma resposta é recebida deste servidor.

PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping

O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.

  1. Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:

nm-tool | tail -n 8 cat /etc/resolv.conf</syntaxhighlight>

  1. Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.
  2. Execute o ping para um endereço de host conhecido

ping www.ifsc.edu.br</syntaxhighlight>

  1. Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP

dns || icmp </syntaxhighlight>

  1. Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos flags do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome.
    Estrutura de uma pergunta simples DNS
  2. Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).
    Estrutura de uma resposta simples DNS
  3. Perguntas a serem respondidas, baseado nos pacotes "Standard query" e "Standard query response":
    1. Quem são os servidores DNS da sua máquina?
    2. O ping gerou pergunta para cada um deles?
    3. Qual o tipo da RR associada a pergunta (Queries). O que significa?
    4. Qual endereço IP retornado para o www.ifsc.edu.br?
    5. Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?
    6. Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?
    7. No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)
    8. Quais os servidores autorizados (Authoritative nameservers) foram repassados como resultado de sua consulta?
  4. Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.
  5. Perguntas a serem respondidas:
    1. Qual o IP que se pretende resolver?
    2. Qual o nome retornado?
    3. O nome retornado é www.ifsc.edu.br? Sim ou não? Explique.

Consultas DNS por meio de ferramentas especializadas

  1. Usando o programa host, Nslookup ou dig, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):
    • mail.ifsc.edu.br
    • www.google.com
    • www.gmail.com
  2. Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos domínios dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa host ou dig isso pode ser feito assim:
    host -t ns ifsc.edu.br
    dig -t ns ifsc.edu.br
    
  3. O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que host recebe emails em um determinado domínio. Isso é utilizado pelos MTA (Mail Transfer Agent) mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (Mail eXchange) de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser host ou dig. Por exemplo:
    host -t mx ifsc.edu.br
    dig -t mx ifsc.edu.br
    
  4. Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:
    • gmail.com
    • hotmail.com
    • ifsc.edu.br
  5. Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio. Isso é chamado de tradução reversa (ou DNS reverso). Usando os programas de diagnóstico já vistos, isso pode ser feito assim:
    dig -x 200.135.37.65
    
    ... o dig tem um resultado um pouco mais carregado que os outros utilitários (host e nslookup), porém neste caso é mais prático. Veja o resultado da consulta logo após a linha ;; ANSWER SECTION:. Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade. Pode-se também usar a variante do dig para respostas curtas:

dig -x 200.135.37.65 +short </syntaxhighlight>

  1. Faça uma consulta iterativa com dig e responda:
    dig +trace mail.ru.
    
    1. Qual foi o RLD (Root Level Domain) consultado?
    2. Qual o TLD (Top Level Domain) consultado?
    3. Qual o SLD (Second Level Domain) consultado?
    4. Como você sabe que foram esses os LDs consultados?

Algumas consultas AAAA

Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.

  1. No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo:

dig AAAA google.com host -t AAAA google.com </syntaxhighlight>

    1. webmail.ufsc.br
    2. www.sj.ifsc.edu.br
    3. www.nyt.com
    4. ipv6.br
    5. www.microsoft.com
  1. Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo:

dig -x 2001:12ff::10 dig -x 2001:12ff::10 +short host 2001:12ff::10 </syntaxhighlight>

    1. 2801:84:0:2::10
    2. 2001:12d0:0:126::183:244
    3. 2001:12ff::10
    4. 2804:1454:1004:100::2

Exemplos de arquivos de um Second Level Domain fictício

  • Exemplo de arquivos de configuração de um servidor BIND

/etc/bind/db.redes $TTL 86400 @ IN SOA ns.redes.edu.br. root ( 2016090900 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL

@ IN NS ns.redes.edu.br. @ IN MX 10 mail.redes.edu.br. $ORIGIN redes.edu.br. ns A 192.168.1.101 www A 192.168.1.102 www A 192.168.1.103 www A 192.168.1.104 www A 192.168.1.105 www A 192.168.1.106 www A 192.168.1.107 ftp A 192.168.1.108 mail A 192.168.1.109 </syntaxhighlight>

/etc/bind/db.2.168.192 (Zona reversa) $TTL 86400 @ IN SOA ns.redes.edu.br. root ( 2016090900 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL

IN NS ns.redes.edu.br. 101 IN PTR ns.redes.edu.br. 102 IN PTR www.redes.edu.br. 108 IN PTR ftp.redes.edu.br. 109 IN PTR mail.redes.edu.br. </syntaxhighlight>

Comparando sockets UDP e TCP

Objetivos

  • Entender o conceito de sockets relacionados aos protocolos UDP e TCP.
  • Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para sockets. Um processo é semelhante a uma casa e o socket do processo é semelhante a uma porta. A aplicação reside dentro da casa e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior da casa mas tem pouco (ou nenhum) controle sobre o exterior.
  • Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual. Observa-se a "agilidade" do UDP e a robustez do TCP.
  • Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.

Descrição da aplicação a ser desenvolvida em UDP e TCP

  • Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de socket:
  1. Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.
  2. O servidor recebe os dados e converte os caracteres para maiúsculas.
  3. O servidor envia os dados modificados ao cliente.
  4. O cliente recebe os dados modificados e apresenta a linha em sua tela.

Programação de sockets com TCP

Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Isso significa que, antes que cliente e servidor possam enviar dados uma ao outro, primeiramente eles devem se apresentar, o primeiro socket da Figura abaixo, e estabelecer uma conexão TCP, o segundo socket da Figura abaixo. Todos os dados trafegarão pelo segundo socket.

O processo TCPServer tem dois sockets:

Programacao socket TCP 1.png

A aplicação cliente-servidor usando TCP:

Programacao socket TCP 2.png

Roteiro
  1. Escreva o código do programa servidor. TCPServer.py

from socket import * serverPort = 33333 serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind((,serverPort))

  1. Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1

serverSocket.listen(1) print 'O servidor esta pronto' while 1: #Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,

       #que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente
       #especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP
       #entre o clientSocket do cliente e o connectionSocket do servidor.

connectionSocket, addr = serverSocket.accept() message = connectionSocket.recv(1024)

       print message

messageMaiuscula = message.upper() connectionSocket.send(messageMaiuscula) connectionSocket.close() </syntaxhighlight>

  1. No terminal da máquina execute o programa:

python TCPServer.py </syntaxhighlight> Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.

  1. Pode-se testar se a porta está aberta:
nmap -p33333 ip_do_servidor </syntaxhighlight>
  1. Qual o estado dessa porta? Cite e justifique o tipo de serviço.
  2. Abra um novo terminal e escreva o programa cliente, TCPClient.py. Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho. Obs.: mantenha as aspas.

from socket import * serverName = 'ip_do_servidor' serverPort = 33333

  1. SOCK_STREAM habilita uso do TCP

clientSocket = socket(AF_INET, SOCK_STREAM)

  1. Representa o estabelecimento da conexao. E o "aperto de maos", onde o cliente e servidor trocam
  2. informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito

clientSocket.connect((serverName,serverPort)) message = raw_input('Entre com a sentanca em minuculas: ')

  1. Diferentemente do UDP, aqui nao e necessario encaminhar o endereco do servidor, ja que este socket
  2. eh uma "tubulacao" direta entre ambos, basta empurrar dados

clientSocket.send(message) modifiedMessage = clientSocket.recv(1024) print 'Mensagem do servidor: ', modifiedMessage clientSocket.close() </syntaxhighlight>

  1. Rode o WireShark. Configure a captura na interface any, use o filtro do tipo: tcp.port==33333.
  2. Digite a mensagem que deseja e espere a resposta do servidor. Funcionou?
  3. Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando o cliente.
  4. Pare a captura no Wireshark.
  5. Perguntas:
    1. As três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?
    2. Em qual mensagem (número) é que a frase é enviada ao servidor?
    3. A mensagem seguinte (quinta) apresenta camada de aplicação? Clique na camada TCP no Wireshark e observe o campo Flags: 0x010 (ACK). O que você acha que isso significa?
    4. Qual o conteúdo da mensagem seguinte (sexta)? E da sétima? Explique.
    5. Explique as três últimas mensagens. Dica: olhe as figuras 3.39 e 3.40 do Kurose versão 6.
    6. Qual é o protocolo da camada de transporte nessa troca de mensagens?
    7. Quais são os números de porta e os IPs utilizados?
    8. Quem definiu o número de porta do cliente?
    9. Quais foram os números de sequência utilizados em todas as mensagens?
    10. Qual o número identificador de protocolo TCP no pacote IP?
    11. Quantos socktes foram abertos no servidor com um cliente "conectado"? E com dois clientes?
    12. Combine com um colega e faça testes entre a sua máquina e dele. Num momento você é o servidor e noutro você é o cliente.
    13. Capture todos os pacotes trocados, entre você e seu vizinho. Os números de portas e IPs são ou não iguais?

Programação de sockets com UDP

A aplicação cliente-servidor usando UDP tem a estrutura apresentada na Figura baixo. Utilizamos a linguagem Python por expor com clareza os principais conceitos de sockets. Quem desejar pode implementar em outras linguagens, por exemplo um modelo para programação de sockets utilizando a API Posix encontra-se aqui.

Programacao socket UDP.png

Como fica evidente na Figura acima, os processos cliente e servidor rodam em máquinas distintas e se comunicam justamente enviando mensagens via sockets, que abstrai qualquer necessidade de conhecimento das camadas subjacentes.

Roteiro
  1. Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.
  2. Escreva o programa UDPServer.py
  3. Esta linha define que pode-se utilizar sockets dentro do programa

from socket import *

  1. Define explicitamente a porta aberta servidor

serverPort = 22222

  1. Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,
  2. em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que
  3. o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.

serverSocket = socket(AF_INET, SOCK_DGRAM)

  1. Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".

serverSocket.bind((, serverPort)) print "O servidor esta pronto para recepcao"

  1. Aguarda indefinidamente por contatos (mensagens) de clientes

while 1:

message, clientAddress = serverSocket.recvfrom(2048)

       print message
       #Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.

modifiedMessage = message.upper() serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight>

  1. No terminal da máquina execute o programa:

python UDPServer.py </syntaxhighlight> Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.

  1. Abra um novo terminal e escreva o programa cliente. UDPClient.py. Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho. Obs.: mantenha as aspas.
  2. Esta linha define que pode-se utilizar sockets dentro do programa

from socket import *

  1. Define o endereco ip do servidor ao qual o cliente contactara.
  2. Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.

serverName = 'ip_do_servidor'

  1. Define a porta de acesso ao servidor

serverPort = 22222

  1. Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,
  2. em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que
  3. o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.

clientSocket = socket(AF_INET, SOCK_DGRAM)

  1. raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que
  2. sera armazenada em message.

message = raw_input('Entre com a sentanca em minuculas: ')

  1. O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante
  2. pelo socket aberto.

clientSocket.sendto(message,(serverName, serverPort))

  1. Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel
  2. modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.

modifiedMessage, serverAddress = clientSocket.recvfrom(2048)

  1. Imprime a mensagem recebida na tela.

print modifiedMessage

  1. Fecha o socket.

clientSocket.close() </syntaxhighlight>

  1. No terminal da máquina execute o programa:

python UDPClient.py </syntaxhighlight> Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.

  1. O cliente pode também ser substituído pelo comando de terminal: netcat -u ip_do_servidor 22222</syntaxhighlight>
  2. Rode o WireShark. Configure a captura na interface any, com o filtro: udp.port == 22222.
  3. Digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?
  4. Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando o cliente.
  5. Pare a captura de pacotes.
  6. PERGUNTAS baseadas na captura:
    1. Em algum momento foi identificado algum procedimento para estabelecimento de conexão?
    2. Em algum campo do UDP existe numeração de mensagens?
    3. Qual o número identificador de protocolo UDP no pacote IP?
    4. Qual é o checksum no pacote (datagrama) UDP?
    5. É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?
    6. Se a mensagem digitada for teste, do cliente para o servidor deve aparacer o campo Data:7465737465 e a resposta do servidor deve aparecer Data: 5445535445. O que significa isso? Dica, olhe na internet o código ASCII.
    7. Qual foi a sequência numérica do campo Data em seu teste? Qual o significado?
    8. Qual é o protocolo da camada de transporte nessa troca de mensagens?
    9. Qual são os dois números de porta e os dois IPs utilizados?
    10. Quem definiu o número de porta do cliente?
    11. Quantos socktes foram abertos no servidor com um cliente "conectado"? E com dois clientes?
    12. Combine com um colega e faça testes entre a sua máquina e dele. Num momento você é o servidor e noutro você é o cliente.
    13. Capture todos os pacotes trocados, entre você e seu vizinho. Os números de portas e IPs são ou não iguais? Explique.
  7. Comparativo entre TCP e UDP:
    1. Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?
    2. O que justifica a diferença na quantidade de mensagens trocadas?
    3. Discuta as vantagens e desvantagens de cada protocolo.

Desafios para casa

  1. Modifique uma das aplicações cliente-servidor, seja UDP ou TCP, para fazer um pingue-pongue com a mensagem, ou seja, o cliente gera e envia a mensagem, o servidor a devolve, o cliente reenvia a mesma mensagem, o servidor a devolve e assim sucessivamente.
  2. Faça a "Tarefa 1: Servidor Web" do livro do Kurose, página 131, 6a ed.

TCP x UDP

Objetivos

  • O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.
  • Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.

Roteiro

Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria. Caso sua interface de rede não seja a eth0 adapte o comando, caso reiniciar a máquina repita-o: sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight>

O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?

  1. Abra um terminal e execute o seguinte comando para fazer o download de um arquivo a ser usado no experimento:
    wget http://tele.sj.ifsc.edu.br/~odilson/RED29004/jogo.exe
    
  2. Observe o tamanho do arquivo transferido ... ele deve ter exatamente 332831416 bytes (cerca de 318 MB). Você pode fazer isso com o comando ls -l jogo.exe, ou executando o gerenciador de arquivos e visualizando as propriedades desse arquivo.
  3. Escolha um colega para fazer o experimento em que o arquivo será transferido de um computador para o outro. NÃO pode ser na própria máquina. Um será o receptor e outro o transmissor.
  4. A primeira transferência será feita usando o protocolo TCP da seguinte forma:
    • Execute o WireShark e deixe-o capturando pacotes somente durante a transferência do arquivo. Como o o comportamento padrão do wireshark é redefinir o número de sequência para sempre iniciar em um e isso pode atrapalhar nossos experimentos, vamos desabilitar essa funcionalidade:

Edit >> Preferences >> Protocols >> TCP >> Desabilite Relative sequence numbers </syntaxhighlight>

    • No computador receptor execute o netcat (nc) (utilize man nc para saber os detalhes das flags utilizadas) que abrirá uma conexão TCP na porta, por exemplo, 5555 e salvará os dados transferidos em arquivo:
      nc -vvnl 5555 > arquivoTCP
      
    • No computador transmissor execute, após o processo do receptor estar executando (substitua ip_do_receptor pelo IP do seu colega):
      time nc -vvn ip_do_receptor 5555 < jogo.exe
      
    • Quando completar a transferência (vai aparecer a mensagem com o tempo gasto no transmissor), pare o Wireshark.
    • Verifique o tamanho do arquivo recebido. Ele é igual ao arquivo original? E quanto tempo levou para transmiti-lo?
    • Analisando a captura de pacotes do WireShark responda:
    1. Quais as portas origem e destino escolhidas pelo cliente e servidor?
    2. Qual é o identificador do primeiro e do último pacote?
    3. Qual é o identificador do primeiro e do último ACK?
    4. É possível calcular o tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor.
    5. Qual é o tamanho do último segmento de dados recebido?
    6. Apresente os segmentos do 3-way handshake e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada em sala de aula?
    7. Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada em sala de aula?
  1. A segunda transferência será feita usando o protocolo UDP:
    • Execute o WireShark e deixe-o capturando pacotes somente durante a transferência do arquivo.
    • No computador receptor baixe o programa receptor, acrescente a ele permissão de execução e o execute, conforme a sequência de comandos abaixo:
      wget http://tele.sj.ifsc.edu.br/~odilson/RED29004/receptor
      chmod +x receptor
      ./receptor 5555 > arquivoUDP
      
    • No computador transmissor baixe o programa transmissor, acrescente a ele permissão de execução e o execute, conforme a sequência de comandos abaixo:
      wget http://tele.sj.ifsc.edu.br/~odilson/RED29004/transmissor
      chmod +x transmissor
      
    • Inicie a transferência do arquivo (substitua ip_do_receptor pelo IP do seu colega):

./transmissor ip_do_receptor 5555 < jogo.exe </syntaxhighlight>

    • Quando completar a transferência (vai aparecer a mensagem no transmissor "Levou XXXXX segundos para transmitir XXXXX bytes), no receptor digite <CTRL + C>, verifique o tamanho do arquivo recebido.
    • Ele é igual ao arquivo original? E quanto tempo levou para transmiti-lo?
    • Analisando a captura de pacotes do WireShark responda:
    1. Qual é o identificar do primeiro e do último pacote? Existe?
    2. É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?
  1. Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.
    1. O que eles têm em comum?
    2. Que diferenças lhe pareceram mais pronunciadas?
    3. Como isso deve afetar as aplicações que usam esses protocolos?

Desvendando o TCP - Número de Sequência, Controle de Erros

Objetivos

  • Verificar:
    • Controle de Erros: Significado de Número de Sequência, ACK
    • Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;

Configuração do Laboratório

O roteiro será executado sobre máquinas virtuais, através do uso do Netkit2. Copie o texto abaixo, abra o editor de sua preferência, cole o texto e salve o arquivo em /home/aluno/TCP.conf. PC1[type]=generic PC2[type]=generic PC3[type]=generic


PC1[eth0]=lan0:ip=10.0.0.1/24 PC2[eth0]=lan0:ip=10.0.0.2/24 PC3[eth0]=lan0:ip=10.0.0.3/24 </syntaxhighlight>

PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos

  1. Executar a configuração do laboratório no Netkit. Abra o NetKit2 e abra o arquivo de configuração:
File > Load and Run </syntaxhighlight>
    • Perceba que abrirá uma janela com três abas inferiores, representando três máquina virtuais criadas pelo Netkit, denominadas: PC1, PC2 e PC3. Cada uma dessas abas é o terminal de configuração da respectiva máquina virtual.
  1. Utilize o editor de texto da máquina real, inclua o texto abaixo, e salve como /home/aluno/lab/shared/arq.tx

ABCDEFGHIJKLMNOPQRSTUVXZW1234 </syntaxhighlight>

  1. Execute o tcpdump no PC3
 tcpdump -i eth0 tcp port 5555 -s 1024 -U -w /hostlab/shared/pc3.cap </syntaxhighlight>
  1. Execute o processo servidor no PC2 e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do buffer). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP

sysctl -w net.ipv4.tcp_rmem='20 20 20' netcat -l 5555 > arq.rx </syntaxhighlight>

  1. Envie o arquivo arq.tx a partir do PC1
 netcat 10.0.0.2 5555 < /hostlab/shared/arq.tx </syntaxhighlight>
  1. No PC3 faça CTRL-C, para parar a caprtura de pacotes.
  2. Abra o arquivo pc3.cap (/home/aluno/lab/shared/pc3.cap) com o wireshark. Você terá algo parecido com o apresentado na Figura 1.
Fig.1 -- Protocolo TCP
  1. Analise como os dados foram transmitidos e reconhecidos.
  2. Perguntas
    1. Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?
    2. Como foi reconhecido cada segmento enviado?
      • Relate esta análise por segmento usando os timestamps como referência.

PARTE 2 - Transmissão com erros: retransmissões

  1. Repetir todo a parte 1 mas substituir o item 4 por:

sysctl -w net.ipv4.tcp_rmem='20 20 20' tc qdisc add dev eth0 root netem loss 50% netcat -l 5555 > arq.rx </syntaxhighlight>

  1. Perguntas:
    1. Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?
    2. Como foi reconhecido cada segmento enviado?
    3. Houve perda de pacotes? Como você identificou isso?
    4. Os pacotes perdidos foram retransmitidos? Justifique.

PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex

  • Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento full-duplex.
  • No experimento, o arquivo de um aluno será transmitido para outro e vice-versa.
  1. Em um terminal, crie um diretório de trabalho e entre no mesmo

mkdir teste cd teste </syntaxhighlight>

  1. Com o gedit construa um arquivo de cerca de 2000 bytes. Coloque neste arquivo um texto qualquer de aproximadamente 2000 letras. Salve o arquivo com nome /home/aluno/teste/arq.tx.
  2. Escolha um colega para transferir o arquivo. Negocie quem será o servidor.
  3. Ambos iniciam o wireshark com um filtro: ip.add==IP_DO_COLEGA.
  4. O servidor deve fazer

netcat -l 5555 < arq.tx > arq.rx </syntaxhighlight>

    • O arq.rx conterá os dados recebidos.
  1. O cliente deve fazer, lembre-se de adequar o IP_SERVIDOR

netcat IP_SERVIDOR 5555 < arq.tx > arq.rx </syntaxhighlight>

  1. Abra o arquivo recebido do colega (arq.rx) com o gedit e confira o conteúdo.

Perguntas:

  1. Onde pode ser observado a comunicação full-duplex?
  2. Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação full-duplex?
  3. Como os ACKs são propagados, em pacotes exclusivos ou de carona (piggyback) com os dados?

TCP: Controle de congestionamento e equidade

Objetivos

  • Tem como objetivo gerar um gráfico para facilitar a visualização do controle de congestionamento e a consequente equidade do protocolo TCP.
  • Utilizar o software Iperf (iperf –h para help) para gerar tráfego entre duas máquinas, cliente e servidor.
  • Utilizar o software netkit2.

Roteiro

  • O roteiro será executado sobre máquinas virtuais, através do uso do Netkit2.
  • Para realização dos ensaios será montada a rede virtual apresentada na Figura 1.
Figura 1 - Rede ara testes
  1. Copie o texto abaixo e crie um arquivo, salve-o como /home/aluno/TCP.conf.

  1. Definição das máquinas

R1[type]=router PC1[type]=generic PC2[type]=generic PC3[type]=generic

  1. Definição dos roteadores padrão

PC1[default_gateway]=10.0.0.254 PC2[default_gateway]=10.0.1.254 PC3[default_gateway]=10.0.1.254

  1. Definição das interfaces do roteador

R1[eth0]=lan0:ip=10.0.0.254/24:rate=10000 R1[eth1]=lan1:ip=10.0.1.254/24:rate=10000

  1. Definição das interfaces dos PCs

PC1[eth0]=lan0:ip=10.0.0.1/24:rate=10000 PC2[eth0]=lan1:ip=10.0.1.2/24:rate=10000 PC3[eth0]=lan1:ip=10.0.1.3/24:rate=10000 </syntaxhighlight>

  1. Execute o NetKit2.
  2. Carregue o arquivo de configuração:
File > Load and Run </syntaxhighlight>
    • Perceba que abrirá uma janela com quatro abas inferiores, representando um roteador e três máquina virtuais criadas pelo Netkit, denominadas: R1, PC1, PC2 e PC3. Cada uma dessas abas é o terminal de configuração do respectivo equipamento.
    • Ao clicar no menu File - Graph, pode-se ter uma visão da rede a ser simulada e conferir se é equivalente ao diagrama proposto.
  1. Execute no PC3 o tcpdump para salvar a troca de dados entre o PC1 e o PC2 num arquivo:

tcpdump -i eth0 -w /hostlab/shared/pc3.cap </syntaxhighlight>

    • Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, no Netkit selecione o terminal da máquina desejada e clique sobre a "rodinha" do mouse que o texto será colado.
  1. No PC1 (servidor) execute:

iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight>

  1. No PC2 (cliente) execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>):

iperf -c 10.0.0.1 -f m -i 1 -t 90 -p 2000 -l 1300 & \ (sleep 20; iperf -c 10.0.0.1 -f m -i 1 -t 70 -p 2001 -l 1300) & \ (sleep 30; iperf -c 10.0.0.1 -f m -i 1 -t 60 -p 2002 -l 1300) & </syntaxhighlight>

  1. Fique monitorando o PC2 até a tela parar de ser atualizada, aproximadamente 90 s.
  2. Pare os processos nos três PCs utilizando CTRL-C.
  3. Abra o Wireshark.
  4. Abra o arquivo

File > Open > /home/aluno/lab/shared/pc3.cap </syntaxhighlight>

  1. No wireshark acesse Statistics >> IO Graph e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2.
    • Perceba que todos os botões Graph 1...4 devem ser clicados, e os filtros aplicados (tcp.port==2000; tcp.port==2001; tcp.port==2002) isso fará com que o Wireshark mostre as respectivas curvas.
      Figura 2 - Captura de 3 fluxos de dados
  2. Responda:
    1. Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.
    2. Explique os filtros aplicados no gráfico do Wireshark.
      • Quais são os 4 gráficos apresentados?
      • Há uma relação de valor entre as curvas?
      • Qual é esta relação?
    3. Por que a curva vermelha se sobrepõe a curva preta nos primeiros 20 segundos? Considere o início do tempo onde há início de tráfego!
    4. Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 20 e 30 segundos?
    5. Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 20 e 40 segundos.
    6. Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 20 e 30 segundos?
Incluindo UDP

Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.

  1. Deslique o NetKit2, para limpar todos os processos e buffers:

File > Quit </syntaxhighlight>

  1. Copie o texto abaixo e crie um arquivo, salve-o como /home/aluno/TCPxUDP.conf:
  2. Definição das máquinas

R1[type]=router PC1[type]=generic PC2[type]=generic PC3[type]=generic PC4[type]=generic

  1. Definição dos roteadores padrão

PC1[default_gateway]=10.0.0.254 PC2[default_gateway]=10.0.1.254 PC3[default_gateway]=10.0.1.254 PC4[default_gateway]=10.0.1.254

  1. Definição das interfaces do roteador

R1[eth0]=lan0:ip=10.0.0.254/24:rate=10000 R1[eth1]=lan1:ip=10.0.1.254/24:rate=10000

  1. Definição das interfaces dos PCs

PC1[eth0]=lan0:ip=10.0.0.1/24:rate=10000 PC2[eth0]=lan1:ip=10.0.1.2/24:rate=10000 PC3[eth0]=lan1:ip=10.0.1.3/24:rate=10000 PC4[eth0]=lan1:ip=10.0.1.4/24:rate=10000 </syntaxhighlight>

  1. Execute o NetKit2 e carregue o arquivo de configuração.
  2. No PC4 execute:

tcpdump -i eth0 -w /hostlab/shared/pc4.cap </syntaxhighlight>

  1. No PC1 execute:

iperf -s -u -p 2000 & iperf -s -p 2001 & </syntaxhighlight>

  1. A próxima etapa deve ser executada "simultaneamente" nos PC2 e PC3.
    1. Para isso copie o texto abaixo e cole no terminal do PC2, ainda NÃO tecle <Enter>:

iperf -u -c 10.0.0.1 -f m -i 1 -t 60 -p 2000 -l 1300 -b 10000000 </syntaxhighlight>

    1. Copie o texto abaixo e cole no terminal do PC3, ainda NÃO tecle <Enter>:

iperf -c 10.0.0.1 -f m -i 1 -t 90 -p 2001 -l 1300 </syntaxhighlight>

    1. Tecle <Enter> no PC3 e PC2, NESSA ORDEM, "simultaneamente".
  1. Fique monitorando o PC3 a tela parar de ser atualizada, aproximadamente 90 s.
  2. Pare os processos nos quatro PCs utilizando CTRL-C.
  3. Rode o Wireshark e abra o arquivo /home/aluno/lab/shared/pc4.cap.
  4. Baseado na Figura 3, no Graph 2 altere o filtro para udp.port==2000 e no Graph 3 altere o filtro para tcp.port==2001. Salve o gráfico gerado.
Figura 3 - Captura de 2 fluxos de dados TCP e UDP
  1. Responda as mesmas questões do item anterior, todas.
  2. Explique o comportamento dos vários fluxos de dados com e sem o UDP.

Protocolos de roteamento

Objetivos

  • Analisar o funcionamento de protocolos de roteamento estático e dinâmico da Internet a partir de uma estrutura física formada por roteadores e redes locais:
    • tabelas estáticas de roteamento
    • os protocolo RIP e OSPF.

Para atingir tais objetivos utilizaremos o netkit2. Leia o tutorial de como o netkit2 trabalha com roteadores.

Arquitetura de rede

Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:

DynamicRoutingTriangle.png

Tabelas estáticas de roteamento

  1. Crie em seu computador um arquivo com nome /home/aluno/exp1.conf, com o seguinte conteúdo: # Hosts definitions

pc1[type]=generic pc2[type]=generic pc3[type]=generic

  1. Routers definitions

r1[type]=gateway r2[type]=gateway r3[type]=gateway

  1. Hosts' interfaces to local routers

pc1[eth0]=link0:ip=192.168.0.1/24 pc2[eth0]=link1:ip=192.168.1.1/24 pc3[eth0]=link2:ip=192.168.2.1/24

  1. Routers' interfaces to local networks

r1[eth0]=link0:ip=192.168.0.254/24 r2[eth0]=link1:ip=192.168.1.254/24 r3[eth0]=link2:ip=192.168.2.254/24

  1. Network "backbone" links

r1[eth1]=backbone0:ip=10.0.0.1/30 r1[eth2]=backbone1:ip=10.0.1.1/30

r2[eth1]=backbone0:ip=10.0.0.2/30 r2[eth2]=backbone2:ip=10.0.2.1/30

r3[eth1]=backbone1:ip=10.0.1.2/30 r3[eth2]=backbone2:ip=10.0.2.2/30 </syntaxhighlight>

  1. Rode o netKit em seu computador. Em um terminal digite: netkit2 & </syntaxhighlight>
  2. No menu File - Load and Run, procure o arquivo /home/aluno/exp1.conf e clique em OK. Abrirá uma janela com 6 abas, onde cada uma delas é um terminal de configuração do respectivo equipamento: PC1-3 ou R1-3.
  3. Ao clicar no menu File - Graph, pode-se ter uma visão da rede a ser simulada e conferir se é equivalente ao diagrama proposto.
  4. Nos três roteadores rode os seguintes comandos para inibir a filtragem de pacotes com rotas incompletas (copie o texto abaixo e cole nos respectivos terminas, com um click sobre a rodinha do mouse):

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter </syntaxhighlight>

  1. Testes de conectividade de enlace e configuração do default gateway.
    1. Por exemplo, no pc1 execute o comando: ping 192.168.0.254 </syntaxhighlight> Obteve sucesso? Sim ou não e por quê?
    2. Teste a conectividade do pc1 executando o comando: ping 10.0.0.1 </syntaxhighlight> Obteve sucesso? Sim ou não e por quê?
    3. Por exemplo, no pc1 execute o comando: ping 10.0.0.2 </syntaxhighlight> Obteve sucesso? Sim ou não e por quê?
    4. Configure o roteador padrão em todos os PCs, por exemplo no pc1: route add -net default gw 192.168.0.254 </syntaxhighlight>
    5. Teste novamente a conectividade, no pc1 execute o comando: ping 10.0.0.1 </syntaxhighlight> e ping 10.0.0.2 </syntaxhighlight> Obteve sucesso? O comportamento foi o mesmo dos iten 6.2 e 6.3? Sim ou não e por quê?
    6. Com os ping do item anterior ativos (um a cada tempo) rode o wireshark no r1 (clique na aba r1 e em seguida no menu wireshark any).
      1. Qual a origem e destino dos pacotes? Por quê?
      2. Qual a diferença no ping entre os dois itens?
  2. Iniciando o roteamento.
    1. Deixe o ping do item 6.3 e o wireshark do item 6.6 rodando e estabeleça uma rota no roteador r2 com o comando: route add -net 192.168.0.0/24 gw 10.0.0.1 </syntaxhighlight> O que ocorreu com o ping e o wireshark? Por quê?
      • Interpretando o comando: route add (adiciona rota) -net 192.168.0.0/24 (para a rede 192.168.0.0/24) gw 10.0.0.1 (utilizando a interface 10.0.0.1, enlace direto, do roteador r1).
    2. Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes". Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, todos os PCs devem pingar entre si.
    3. Trace e anote as rotas entre os hosts através do traceroute.
  3. Testando a queda de enlace.
    1. Com todas as rotas em perfeito funcionamento, gere um ping do pc1 para o pc3 e execute wireshark any no r1 , em seguida "derrube" o enlace entre o r1 e r3. Por exemplo, no r3 execute o comando: ifconfig eth1 down </syntaxhighlight> O que ocorreu com o ping e o wireshark? Por quê? Com este enlace comprometido qual seria a solução para a continuidade de funcionamento de toda a rede?

Testando campo TTL com loop na rede

  1. No arquivo abaixo as tabelas de roteamento geram um loop. Copie o conteúdo abaixo e crie um arquivo loop.conf
  2. Hosts definitions

pc1[type]=generic pc2[type]=generic pc3[type]=generic

  1. Default gateways definitions

pc1[default_gateway]=192.168.0.254 pc2[default_gateway]=192.168.1.254 pc3[default_gateway]=192.168.2.254

  1. Routers definitions

r1[type]=gateway r2[type]=gateway r3[type]=gateway

  1. Hosts' interfaces to local routers

pc1[eth0]=link0:ip=192.168.0.1/24 pc2[eth0]=link1:ip=192.168.1.1/24 pc3[eth0]=link2:ip=192.168.2.1/24

  1. Routers' interfaces to local networks

r1[eth0]=link0:ip=192.168.0.254/24 r2[eth0]=link1:ip=192.168.1.254/24 r3[eth0]=link2:ip=192.168.2.254/24

  1. Network "backbone" links

r1[eth1]=backbone0:ip=10.0.0.1/30 r1[eth2]=backbone1:ip=10.0.1.1/30

r2[eth1]=backbone0:ip=10.0.0.2/30 r2[eth2]=backbone2:ip=10.0.2.1/30

r3[eth1]=backbone1:ip=10.0.1.2/30 r3[eth2]=backbone2:ip=10.0.2.2/30

  1. Routes definition

r1[route]=192.168.2.0/24:gateway=10.0.0.2 r2[route]=192.168.2.0/24:gateway=10.0.2.2 r3[route]=192.168.2.0/24:gateway=10.0.1.1 </syntaxhighlight>

    • Lembre-se de rodar os comandos para evitar filtros de pacotes nos três roteadores:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter </syntaxhighlight>

  1. Configure os roteadores para salvar os dados coletados, com os seguintes comandos:
    1. No r1:

tcpdump -i any -w /hostlab/r1.pcap & </syntaxhighlight>

    1. No r2:

tcpdump -i any -w /hostlab/r2.pcap & </syntaxhighlight>

    1. No r3:

tcpdump -i any -w /hostlab/r3.pcap & </syntaxhighlight>

  1. Gere um tráfego controlado a partir do pc1:

ping -c2 192.168.2.1 </syntaxhighlight>

  1. Pare (Ctrl + C) todas as coletas de dados nos roteadores.
  2. Com o Wireshark abra os três arquivos de pacotes capturados: /home/aluno/lab/r1.pcap...r3.pcap. Deixe as três janelas do Wireshark lado a lado e responda:
    1. Em qual roteador os pacotes são descartados? Observe os pacotes de número de sequência 1 e explique sua resposta.
    2. Qual o significado da linha com o seguinte conteúdo parcial: 192.168.0.1 ICMP 128 Time-to-live exceeded (Time to live exceeded in transit)?

Protocolos de roteamento, parte2

Objetivo

  • Proporcionar ao aluno uma visão prática de roteamento IP

PARTE 1 - Rede com 3 roteadores

Laboratório a ser montado no netkit.
Figura 1 - Rede para roteamento
  1. Construir a rede apresentada na Figura 1, usando como apoio a configuração do netkit descrita na sequência. As sub-redes (SN) a serem utilizadas na parte 1 e 2 são:
    1. SN1 : 200.10.1.0/24
    2. SN2 : 200.10.2.0/24
    3. SN3 : 200.10.3.0/24
    4. SN4 : 200.10.4.0/24
    5. SN5 : 200.10.5.0/24
    6. SN6 : 200.10.6.0/24
    7. SN7 : 200.10.7.0/24
    8. SN8 : 200.10.8.0/24
  2. Abaixo o arquivo de configuração para o NetKit. Copie e salve como /home/aluno/roteamento.conf.

H1[type]=generic H2[type]=generic

R1[type]=generic R2[type]=generic R3[type]=generic


H1[eth0]=SN1:ip=200.10.1.1/24 H2[eth0]=SN8:ip=200.10.8.1/24

R1[eth0]=SN1:ip=200.10.1.254/24 R1[eth1]=SN4:ip=200.10.4.1/24 R1[eth2]=SN2:ip=200.10.2.1/24


R2[eth0]=SN8:ip=200.10.8.254/24 R2[eth1]=SN4:ip=200.10.4.2/24 R2[eth2]=SN7:ip=200.10.7.1/24

R3[eth0]=SN2:ip=200.10.2.2/24 R3[eth1]=SN7:ip=200.10.7.2/24 </syntaxhighlight>

  1. Inicie o Netkit e carregue o arquivo de configuração e execute-o.
  2. Execute comandos de ping entre os hosts e roteadores.
    1. O ping entre as interfaces/equipamentos pertencentes a mesma sub-rede funcionam, por quê?
    2. O ping entre interfaces/equipamentos de sub-redes distintas não funcionam, por quê?
  3. Usando como apoio o comando abaixo insira as rotas default em H1 e H2:
    1. H1: route add default gw 200.10.1.254 </syntaxhighlight>
  4. Habilitar o roteamento e instalar rotas em cada roteador para que pacotes vindos de H1 para H2 passem por R1, R3 e R2. O retorno deve ser via R2 e R1. Use o exemplo de adição de rotas presente na configuração do R1. Obs: O traceroute só retornará as rotas corretamente se, em todos os roteadores do caminho, houver rota tanto para a rede do IP de destino como do IP de origem do respectivo pacote, se não, ele "se perde".
    1. R1:

echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter route add -net 200.10.8.0/24 gw 200.10.2.2 </syntaxhighlight>

    1. R2:

echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter </syntaxhighlight>

    1. R3:

echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter </syntaxhighlight>

  1. Teste a conectividade IP com o comando ping.
    1. O ping entre as interfaces/equipamentos pertencentes a mesma sub-rede funcionam, por quê?
    2. O ping entre interfaces/equipamentos de sub-redes distintas não funcionam, por quê?
  2. Teste a conectividade IP com o comando ping. Ambos os hosts devem se "pingar".
  3. Confirme e anote os caminhos estabelecidos monitorando as interfaces com o tcpdump e/ou traceroute.

PARTE 2 - Desafio: Rede com 4 roteadores

Configure a rede abaixo (no netkit) de forma que pacotes vindos de H1 para H2 passem por R1,R3,R4 e R2. O retorno deve ser por R2,R4 e R1. Cada rede SN está em uma rede ethernet separada.

  1. Anote as rotas realizados, com o apoio do tcpdump e tracerotue.
  • SN1 : 200.10.1.0/24
  • SN2 : 200.10.2.0/24
  • SN3 : 200.10.3.0/24
  • SN4 : 200.10.4.0/24
  • SN5 : 200.10.5.0/24
  • SN6 : 200.10.6.0/24
  • SN7 : 200.10.7.0/24
  • SN8 : 200.10.8.0/24

ExercicioConfEstaticaZebra.png

PARTE 3 - Criando loop para verificar o campo TTL

Crie um conjunto de rotas que façam que um pacote vindo de H1 para H2 entre em um loop entre R1-R3-R2-R1. Envie um pacote único com o ping de H1 para H2. Rastreie com o tcpdump o pacote em loop e verifique o momento em que o pacote sai de circulação.

  1. Salve a tela com a captura mostrando o ttl=0.

Protocolos de roteamento, parte 3

O Pacote Quagga: breve introdução

O pacote Quagga fornece um conjunto de processos (daemons) com facilidades para a construção da tabela de roteamento de um sistema. O projeto Quagga é derivado do pacote Zebra. O esquema abaixo mostra a estrutura do Quagga.

EstruturaZebra.png

Acima do kernel se executam processos especializados para a configuração da tabela de roteamento. Note que a tabela de roteamento é mantida pelo kernel do Sistema Operacional Linux/Unix e qualquer modificação será realizada a partir da API (Application Programming Interface) do sistema. O processo Zebra centraliza todo o gerenciamento da tabela recebendo e repassando informações para outros processos que executam um determinado protocolo de roteamento. Por exemplo, no esquema mostrado existem 3 processos responsáveis pela execução dos protocolos BGP, RIP e OSPF. É possível executar vários protocolos de roteamento dinâmico simultaneamente.

Cada processo do Quagga possui o seu próprio arquivo de configuração e um terminal para receber comandos (um processo shell chamado vtysh). Cada terminal se comunica com seu deamon por uma porta específica. No arquivo do Zebra deverão constar as configurações estáticas.

Os deamons do sistema são chamados pelos seguintes nomes:

  • zebra (acesso pela porta 2601 no vty);
  • ripd (acesso pela porta 2602 no vty);
  • ospfd (acesso pela porta 2604 no vty);
  • bgpd (acesso pela porta 2605 no vty);

Os deamons possuem arquivos de configuração por default localizados normalmente no diretório /etc/quagga e possuindo a terminação conf: por exemplo: zebra.conf para o processo zebra. Entretanto, em nossos laboratórios, fazendo uso do Netkit, será comum usarmos arquivos de configuração fornecidos na linha de comando:

#zebra -d -f /hostlab/r1/zebra.conf.

Nos arquivos de configuração podemos colocar informações tais como senhas para o terminal vty, configurações de depuração, de roteamento e de log. O que segue aos pontos de exclamação (vale também \#) são comentários.

Através do Zebra (e seu arquivo de configuração) é possível ligar/desligar interfaces e atribuir endereços as mesmas. Também pode-se acrescentar rotas.


Protocolo de roteamento RIP

  1. Baseado no mesmo diagrama abaixo, usaremos serviços para rodar os protocolos de roteamento RIP a partir do Quagga, de tal modo que as tabelas estáticas de roteamento não mais serão necessárias e o sistema se auto recuperará da queda de um único enlace (nesse caso). DynamicRoutingTriangle.png
  2. Crie em seu computador um arquivo com nome /home/aluno/RIP.conf. Observe que nessa configuração já está inserida a definição dos default gateway de cada pc. O conteúdo do arquivo é o seguinte:
  3. Hosts definitions

pc1[type]=generic pc2[type]=generic pc3[type]=generic

  1. Default gateways definitions

pc1[default_gateway]=192.168.0.254 pc2[default_gateway]=192.168.1.254 pc3[default_gateway]=192.168.2.254

  1. Routers definitions

r1[type]=gateway r2[type]=gateway r3[type]=gateway

  1. Hosts' interfaces to local routers

pc1[eth0]=link0:ip=192.168.0.1/24 pc2[eth0]=link1:ip=192.168.1.1/24 pc3[eth0]=link2:ip=192.168.2.1/24

  1. Routers' interfaces to local networks

r1[eth0]=link0:ip=192.168.0.254/24 r2[eth0]=link1:ip=192.168.1.254/24 r3[eth0]=link2:ip=192.168.2.254/24

  1. Network "backbone" links

r1[eth1]=backbone0:ip=10.0.0.1/30 r1[eth2]=backbone1:ip=10.0.1.1/30

r2[eth1]=backbone0:ip=10.0.0.2/30 r2[eth2]=backbone2:ip=10.0.2.1/30

r3[eth1]=backbone1:ip=10.0.1.2/30 r3[eth2]=backbone2:ip=10.0.2.2/30 </syntaxhighlight>

  1. Em cada roteador, configure o serviço RIP para que que os testes da próxima etapa possam ser executados. O Netkit cria no home do usuário uma pasta chamada "lab".
    1. Nesta pasta, há uma pasta para cada equipamento da rede em teste.
    2. Neste diretório podem ser colocados arquivos de configuração de serviços a serem executados nas máquinas virtuais do Netkit. É por ali que será configurado, primeiramente, o Quagga, software de roteamento que implementa RIP, OSPF e BGP.
    3. O arquivo de configuração abaixo mostra a configuração do Quagga para o roteador r1. Salve este arquivo como /home/aluno/lab/r1/zebra.conf.
    4. Em seguida, adapte o arquivo para os roteadores r2 e r3 observando a figura do diagrama da rede para não errar os IPs.
      hostname r1
      
      interface eth0
         ip address 192.168.0.254/24
      interface eth1
         ip address 10.0.0.1/30
      interface eth2
         ip address 10.0.1.1/30
      
      log stdout
      
  2. Crie os arquivos de configuração para o RIP em cada roteador, colocando-os dentro dos diretórios dos mesmos, por exemplo, para r1 no diretório /home/aluno/lab/r1/. O nome destes arquivos deve ser ripd.conf e o conteúdo deve ser o abaixo.
    router rip
      redistribute connected
      redistribute static
      network eth1
      network eth2
    
  3. No pc1 execute: ping 192.168.2.1 </syntaxhighlight> O ping está funcionando? Por quê?
  4. Deixe o ping rodando!
  5. Inicie o daemon quagga em todos os roteadores (r1, r2 e r3). service quagga start </syntaxhighlight>
  6. Execute o Quagga e o RIP em todos os roteadores (r1, r2 e r3), a partir dos arquivos criados. Os arquivos que estão na pasta "/home/aluno/lab" são montados na pasta "/hostlab/" de todas as máquinas virtuais do Netkit, ou seja, "/home/aluno/lab" na máquina real é a mesma pasta que "/hostlab/" nas máquinas virtuais do Netkit. Para iniciar os serviços no r1, faça algo como o que está no exemplo abaixo. Repita o procedimento para r2 e r3 utilizando os arquivos corretos.
    zebra -d -f /hostlab/r1/zebra.conf
    ripd -d -f /hostlab/r1/ripd.conf
    
  7. Olhe o terminal do pc1, o que ocorreu com o ping? Por quê?
  8. Observando o estado do sistema. Vamos usar comandos para verificar o estado dos roteadores.
    1. Solicitar uma sessão com o vtysh no zebrad: vtysh </syntaxhighlight>
    2. Verifique o estado das interfaces usando o comando: show interface </syntaxhighlight>
    3. Verifique se o roteador está habilitado para roteamento: show ip forwarding </syntaxhighlight>
    4. Verifique o estado da tabela de roteamento usando o comando: show ip route </syntaxhighlight> Interprete detalhadamente essa tabela! Você consegue visualizar o mapa da rede a partir dessa tabela?
    5. Verifique a configuração atual do roteador: show run </syntaxhighlight>
    6. Sair do vtysh: exit </syntaxhighlight>
  9. Teste as demais conectividades entre os PCs com pings mútuos. Tudo funcionando?
  10. A partir de cada PC trace a rota (traceroute) para os demais PC e anote-as.
  11. Com o route -n e/ou netstat -r verifique a anote as rotas de cada roteador.
  12. Pare todos os pings.
  13. Execute tcpdump -i any -w /hostlab/ripr1.pcap & no r1, aguarde uns 2 minutos para capturar pacotes específicos do protocolo de roteamento RIP.
  14. Com o navegador de arquivos entre na pasta /home/aluno/lab/ e dê um duplo click no arquivo ripr1.pcap e tente compreender as mensagens RIPv2 (UDP 17) trocadas. As mensagens são trocadas aproximadamente a cada minuto, se não aparecer nenhuma no Wireshark faça um reload: <Ctrl+r> até susrgir alguma mensagem. Olhe com atenção os IPs e as métricas apresentadas.
    1. O que dizem essas mensagens?
    2. Pesquise o significado do endereço 224.0.0.9.
  15. A partir do pc1 deixe rodando o ping ping 192.168.2.1</syntaxhighlight>
  16. Com o tcpdump rodando em r1, desative um dos enlaces entre os roteadores e acompanhe a troca de mensagens no Wireshark (dê um reload). Por questões de compatibilidade vamos desativar uma interface de um modo especial. Por exemplo, para "derrubar" o enlace r1-r3, execute no r1:

vtysh 2061 entra no zebrad conf t entra no mode de configuração interface eth2 entra na referida interface a ser operada shutdown desativa a interface, se desejado </syntaxhighlight>

  1. Permaneça monitorando o ping e o Wireshark (reload: <Ctrl+r>), a recuperação das rotas leva em torno de 1-3 min:
    1. Quais as mensagens trocadas pelo protocolo RIP observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.
    2. Qual o tempo aproximado para a total recuperação das rotas? (Isso seja observável pela diferença de tempos (timestamp) na sequência de mensagens observadas no Wireshark).
  2. Teste as conectividades. O que aconteceu?
  3. Retrace as rotas com nos roteadores vtysh 2061

show ip route </syntaxhighlight> e com o traceroute </syntaxhighlight> a partir dos PCs.

    1. São diferentes do caso original (todos enlaces ativos)? Por quê?
    2. Quais os caminhos/rotas que foram reescritos? Por quê?

Protocolos de roteamento, parte 4

Protocolo de roteamento OSPF

DynamicRoutingTriangle.png

  1. Crie em seu computador um arquivo com nome /home/aluno/OSPF.conf. O conteúdo do arquivo é o seguinte:
  2. Hosts definitions

pc1[type]=generic pc2[type]=generic pc3[type]=generic

  1. Default gateways definitions

pc1[default_gateway]=192.168.0.254 pc2[default_gateway]=192.168.1.254 pc3[default_gateway]=192.168.2.254

  1. Routers definitions

r1[type]=gateway r2[type]=gateway r3[type]=gateway

  1. Hosts' interfaces to local routers

pc1[eth0]=link0:ip=192.168.0.1/24 pc2[eth0]=link1:ip=192.168.1.1/24 pc3[eth0]=link2:ip=192.168.2.1/24

  1. Routers' interfaces to local networks

r1[eth0]=link0:ip=192.168.0.254/24 r2[eth0]=link1:ip=192.168.1.254/24 r3[eth0]=link2:ip=192.168.2.254/24

  1. Network "backbone" links

r1[eth1]=backbone0:ip=10.0.0.1/30 r1[eth2]=backbone1:ip=10.0.1.1/30

r2[eth1]=backbone0:ip=10.0.0.2/30 r2[eth2]=backbone2:ip=10.0.2.1/30

r3[eth1]=backbone1:ip=10.0.1.2/30 r3[eth2]=backbone2:ip=10.0.2.2/30 </syntaxhighlight>

  1. Crie os arquivos de configuração para o OSPF em cada roteador, colocando-os dentro dos diretórios dos mesmos (p. ex: /home/aluno/lab/r1). O nome destes arquivos deve ser ospfd.conf e o conteúdo deve ser conforme o modelo abaixo para o r1. Para o r2 e r3 faça as adaptações necessárias.
    #Router r1
    #
    hostname r1
    password r1
    enable password r1
    #
    interface eth0
    interface eth1
    interface eth2
    !ip ospf network point-to-point
    router ospf
    passive-interface eth0
    network 192.168.0.0/24 area 0
    network 10.0.0.0/30 area 0
    network 10.0.1.0/30 area 0
    #
    log stdout
    
  2. Os arquivos zebra.conf são os mesmos utilizados no experimento "Protocolos de Roteamento, parte 3".
  3. Inicie o daemon quagga em todos os roteadores (r1, r2 e r3). service quagga start </syntaxhighlight>
  4. Execute o Quagga e o OSPF a partir dos arquivos criados. Os arquivos que estão na pasta "/home/aluno/lab" são montados na pasta "/hostlab/" de todas as máquinas virtuais do NetKit. Para iniciar os serviços no r1, faça algo como o que está no exemplo abaixo. Repita o procedimento para r2 e r3 utilizando os arquivos corretos.

zebra -d -f /hostlab/r1/zebra.conf ospfd -d -f /hostlab/r1/ospfd.conf </syntaxhighlight>

  1. Repita, na medida do possível e fazendo os devidos ajustes, as atividades 11 a 21 do experimento anterior e responda, além das respectivas questões desses itens:
    1. As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?
    2. Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Por quê?

Neighbor Discovery e roteamento estático no IPv6

Este roteiro foi baseado no material disponível no Livro - Laboratório de IPv6.

Slides de endereçamento IPv6.

Guia didático de endereçamento IPv6 obtido de http://ipv6.br/.

Objetivos do laboratório:

  • Um primeiro contato com o protocolo IPv6
  • Compreender o funcionando do Neighbor Discovery, o equivalente ao ARP (Address Resolution Protocol) do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.
  • Aprender configurações básicas de interfaces IPv6 no Linux
  • Aprender configurações básicas de rotas IPv6

Introdução teórica

Obs.: texto copiado literalmente de: Laboratório de IPv6.

A descoberta de vizinhança por meio do protocolo Neighbor Discovery no IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.

  • O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem Neighbor Solicitation (NS) para todos os nós do enlace pertencentes ao grupo multicast solicited-node (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.
  • É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um truque interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.
  • Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo Target. O campo Source link-layer address informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.
  • O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem Neighbor Advertisement (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo Target link-layer address.
  • A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada neighbor cache. Nela também fica registrado o status de cada destino, informando se o mesmo é alcançável ou não.

Roteiro de atividades:

A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 Global Unicast já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.

Diagrama rede IPv6.jpg

  1. Crie em seu computador um arquivo com nome /home/aluno/IPv6.conf, com o seguinte conteúdo:
  2. Ligacao das maquinas nos dominios de colisao
  3. Duas pequenas redes interligadas pelo backbone
  1. Hosts definitions

pc1[type]=generic pc2[type]=generic pc3[type]=generic pc4[type]=generic

  1. Hosts' interfaces to local routers

pc1[eth0]=link0:ipv6=2001:bcc:faca:1::101/64 pc2[eth0]=link1:ipv6=2001:bcc:cafe:1::102/64 pc3[eth0]=HUB1:ipv6=2001:bcc:1f0:1::103/64

  1. Default Gateways definitions

pc1[route]=default6:gateway=2001:bcc:faca:1::1 pc2[route]=default6:gateway=2001:bcc:cafe:1::1 pc3[route]=default6:gateway=2001:bcc:1f0:1::1

  1. Routers definitions

r1[type]=gateway r2[type]=gateway

  1. Routers interfaces definitions

r1[eth0]=backbone0:ipv6=2001:db8:dead:1::1/64 r1[eth1]=link0:ipv6=2001:bcc:faca:1::1/64 r1[eth2]=link1:ipv6=2001:bcc:cafe:1::1/64

r2[eth0]=backbone0:ipv6=2001:db8:dead:1::2/64 r2[eth1]=HUB1:ipv6=2001:bcc:1f0:1::1/64

</syntaxhighlight>
  1. Rode o NetKit em seu computador. Em um terminal digite:

netkit2 & </syntaxhighlight>

  1. No menu File - Load and Run, procure o arquivo /home/aluno/IPv6.conf e clique em OK.
  2. Ao clicar no menu File - Graph, pode-se ter uma visão da rede a ser simulada e conferir se é equivalente ao diagrama proposto.
  3. Observe que todas as interfaces de rede já estão pré-configuradas, exceto do pc4.
  4. Adapte o comando abaixo, que seria do pc1, para adicionar o endereço IPv6 à interface de rede no pc4:

ip addr add 2001:bcc:faca:1::101/64 dev eth0 </syntaxhighlight>

  1. No pc4 use o seguinte comando para verificar como ficou a configuração dos endereços da interface de rede. O resultado é similar ao apresentado pelo comando ifconfig:

ip addr show dev eth0 </syntaxhighlight>

  1. No pc4, acrescente o default gateway com o seguinte comando:

ip -6 route add default via 2001:bcc:1f0:1::1 dev eth0 </syntaxhighlight>

  1. Faça um ping6 entre o pc3 ao pc4.
  2. Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o pc3 e pc4. Explique o por quê?
  3. Faça um ping6 entre o pc1 ao pc2.
  4. Obteve sucesso? Sim ou não e por quê?
  5. Faça um ping6 entre o pc1 ao pc4.
  6. Obteve sucesso? Sim ou não e por quê?
  7. No r1, adicione uma rota estática para a rede dos pc3 e pc4 através do seguinte comando:

ip -6 route add 2001:bcc:1f0:1::/64 via 2001:db8:dead:1::2 dev eth0 </syntaxhighlight>

  1. No r2, adicione uma rota estática para a rede dos pc1 e pc2 através dos seguintes comandos:

ip -6 route add 2001:bcc:faca:1::/64 via 2001:db8:dead:1::1 dev eth0 ip -6 route add 2001:bcc:cafe:1::/64 via 2001:db8:dead:1::1 dev eth0 </syntaxhighlight>

  1. Pode-se conferir se as rotas foram corretamente configuradas com o comando:

ip -6 route show </syntaxhighlight>

  1. Faça novamente o ping6 entre o pc1 ao pc4.
  2. Obteve sucesso? Sim ou não e por quê?
  3. A partir do computador pc1 use os comandos e anote as rotas obtidas.

traceroute6 2001:bcc:1f0:1::103 traceroute6 2001:bcc:1f0:1::104 </syntaxhighlight>

  1. Use o comando abaixo para consultar a tabela de roteamento de cada um dos roteadores. São coerentes com os dados das rotas obtidas acima?

ip -6 route show </syntaxhighlight>

  1. Deixe um ping6 entre o pc1 ao pc3 rodando.
  2. Rode o wireshark no r1 com os procedimentos:
    1. Clique sobre a aba do r1.
    2. Menu: Wireshark >> any
  3. Explique o processo de descoberta de vizinhança (neighbor discovery / Neighbor Solicitation - NS e Neighbor Advertisement - NA), citando os endereços de multicast e link local utilizados.
  4. Alguns exemplos de campos visualizáveis para uma mensagem do tipo Neighbor Advertisement:
    1. Destination (camada Ethernet)
      • O endereço MAC do nó requisitante que foi obtido por meio da mensagem NS enviada anteriormente.
    2. Source (camada Ethernet)
      • A origem é o endereço MAC da interface do dispositivo que enviou a resposta.
    3. Type (camada Ethernet)
      • Indica que a mensagem utiliza IPv6.
    4. Next header (camada IPv6)
      • Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.
    5. Source (camada IPv6)
      • A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.
    6. Destination (camada IPv6)
      • Diferentemente da mensagem NS, a mensagem NA possui como destino o endereço IPv6 global do nó requisitante.
    7. Type (camada ICMPv6)
      • Indica que a mensagem é do tipo 136 (Neighbor Advertisement).
    8. Flags (camada ICMPv6)
      • Uma mensagem NA possui três flags:
      1. Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.
      2. Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.
      3. Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.
    9. Target Address (camada ICMPv6)
      • Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.
    10. ICMPv6 option (camada ICMPv6)
      • Indica as opções do pacote ICMPv6:
      1. Target link-layer address
    11. Type
      • Indica o tipo de opção. Neste caso, Target link-layer address.
    12. Link-layer address
      • Indica o endereço MAC da interface do dispositivo em questão.
  5. Numa mensagem do tipo Neighbor Solicitation qual é o endereço IPv6 de origem e destino? Explique/defina ambos.
  6. Em todos os hosts rode o comando ip -6 neighbor show </syntaxhighlight>
    1. Qual é a funcionalidade desse comando?
    2. Qual é o significado do conteúdo dessa tabela?
    3. A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?
    4. Por que, por exemplo, na tabela do pc3 não há uma referência explícita ao pc1?
  7. Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.