RED29004-Laboratórios

De MediaWiki do Campus São José
Revisão de 13h43min de 8 de fevereiro de 2018 por 127.0.0.1 (discussão) (Criou página com '==Laboratório 1 - Ferramentas básicas: ''Ping'' e ''Traceroute''== ==Objetivos== *Familiarização com a infraestrutura dos laboratórios de redes *Conhecer aplicativos para ve...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Laboratório 1 - 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
  • Familiarização com o sniffer de rede WireShark

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

Máquinas virtuais

Eventualmente serão utilizadas nessa disciplina.

Os Laboratórios de Redes de Computadores estão equipados com N+1 (N = número de computadores para alunos) computadores conectados em rede e com acesso a Internet, Figura 1. A rede local do laboratório tem endereço IP 192.168.1.0/24. A máscara de rede /24 indica que o último byte do endereço é utilizado para identificar cada máquina, por exemplo 192.168.1.1, 192.168.1.2, etc. O sistema operacional hospedeiro é o Linux Ubuntu. Como os laboratórios são utilizados por várias disciplinas/alunos/professores, os usuários não tem acesso a senha de root (administrador). Para possibilitar a execução de comandos exclusivos do administrador (usuário root), cada computador tem instaladas máquinas virtuais, as quais podem ser lançadas a partir do aplicativo VirtualBox. As máquinas virtuais pertencem a mesma rede local do laboratório e tem endereçamento 192.168.1.x, sendo o byte que identifica a máquina (x) deverá ser manualmente configurado com a seguinte regra: M1 – 101, M2 – 102,..., M9 – 109, M10 – 110,..., M14 – 114 . Por exemplo:, M1 ficará com o endereço 192.168.1.101.

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. Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?
    3. Quais são os endereços IPv4? De onde o sistema obteve esses endereços?
    4. 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 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.nasa.com www.polito.it </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)
    5. -b (Se desejarmos descobrir o endereço IP de vários hosts em uma rede local, poderemos utilizar o ping no endereço de broadcast)
    • No Ubuntu a resposta a um ping no endereço de broadcast é desabilitada por padrão e somente o administrador pode habilitar esta funcionalidade. Quem desejar testar esse tipo de ping deverá utilizar uma máquina virtual qualquer (VirtualBox) e habilitar a resposta a um ping no endereço de broadcast. Para tal, primeiro iniciamos uma máquina virtual, logamos como aluno/aluno e depois executamos em um terminal os comandos abaixo

sudo su echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts </syntaxhighlight> em seguida esta máquina responderá a ping no broadcast.

    1. Execute um ping broadcast e explique porque aparece o termo (DUP!) após cada resposta. Dica: observe o número de sequência.

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:

traceroute 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 externos.
  2. Explique as diferenças entre os tempos de resposta:
    1. Entre traceroutes para diferentes destinos.
    2. Entre as três medidas apresentadas para cada salto.
    3. 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 *.

Laboratório 1 - Ferramentas básicas: WireShark

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

  • 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. Saia do Wireshark.
  14. Com Wireshark ativo (Abra-o novamente) acesse um sítio 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.
    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?

|}

Laboratório Extra - Conceituando protocolos

Objetivos

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

Protocolo de rede

  • Protocolo é o conjunto de regras sobre o modo como se dará a comunicação entre as partes envolvidas. Protocolo é a "língua" dos computadores, ou seja, uma espécie de idioma que segue normas e padrões determinados. É através dos protocolos que é possível a comunicação entre um ou mais computadores.

Atividades

  1. Desative todas as atividades de rede de seu computador.
  2. Abra o wireshark e deixe capturando mensagens com o filtro icmp ativo.
  3. A estrutura básica de um pacote que flui do cliente para o servidor e vice-versa é: Estrutura do Pacote
    1. Dst e Src são utilizados para identificar o nome do emissor e destinatário: as iniciais dos nomes.
  4. 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. Para construir a mensagem utilize o código ASCII: Tabela ASCII
  5. Envie essa mensagem através do comando ping com a flag pattern. Ex: ping -p FF0200416C6C4F6469362D3103FF 192.168.1.1 </syntaxhighlight>
  6. 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. Monte uma resposta e utilize o comando ping para responder ao emitente.
Laboratório 2 - Desvendando o HTTP com Wireshark

Fonte base: Wireshark - HTTP

Objetivos

  • Baseado na pequena introdução ao Wireshark apresentada no Laboratório 1, agora estamos prontos para utilizar o Wireshark para investigar protocolos em operação.
  • Explorar vários aspectos do protocolo HTTP:
    1. a interação básica GET/resposta do HTTP,
    2. formatos de mensagens HTTP,
    3. baixando arquivos grandes em HTML,
    4. baixando arquivos em HTML com objetos incluídos, e
    5. segurança HTTP.

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

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 Laboratório 1;
  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

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.

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. Compare o resultado das execuções desses comandos com o que se viu no 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 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, 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. 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? Descreva o processo de download dos objetos em ambos os casos.

A Interação HTTP GET Condicional/Resposta

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.

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 segunda 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 à segunda 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 segunda mensagem de retorno do servidor?

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>

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.

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.

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?
  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

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;
  5. 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;
  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.

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.

HTTPS

Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação. Execute os seguintes procedimentos:

  1. inicie o navegador web;
  2. limpe o cache do seu navegador;
  3. inicie o Wireshark;
  4. digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;
  5. pare a captura de pacotes e digite "ssl" na caixa de texto de especificação de filtro, para que apenas as mensagens criptografadas sejam exibidas.

Responda:

  1. Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?
  2. Que tipos de campos são mais presentes nesse tipo de mensagens?
  3. Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens http?
Laboratório 3 - 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,
  2. uma pequena análise do protocolo e
  3. consultas AAAA

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.

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
  2. 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.
  3. Execute o ping para um endereço de host conhecido
    ping www.ifsc.edu.br
  4. Pare a captura e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP
    dns || icmp
  5. 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
  6. 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
  7. Perguntas a serem respondidas, baseado nos pacotes "Standard query" e "Standard query responde":
    1. Quem são os servidores DNS da sua máquina?
    2. O ping gerou uma pergunta para cada um deles?
    3. Qual o tipo da RR (Registro) 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. No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)
    7. Quais os endereços IPv4 dos servidores autorizados repassados?
  8. 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, onde se fornece um IP e o servidor devolve o nome da máquina.
  9. Perguntas a serem respondidas:
    1. Qual o IP que se pretende resolver?
    2. Qual o nome retornado?

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. Descubra e anote no relatório: qual o servidor DNS usado pelo seu computador? Num terminal digite:
    cat /etc/resolv.conf
    caso a resposta seja "nameserver 127.0.1.1" (endereço de loopback), provavelmente o sistema gráfico está controlando sua interface, nesse caso execute:
    nm-tool | tail -n 8
    
  4. 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
    
    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 recursiva 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?
  2. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o Root Level Domain, o Top Level Domain e o Second Level Domain. Anote no relatório.
    1. Descubra quem são os servidores raiz (topo de hierarquia DNS):
      host -t ns .
      dig -t ns .
      
    2. Escolha um dos servidores RLD listados, e use-o para fazer as consultas. Por exemplo:
      host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.
      
      ... e observe a seção ;; AUTHORITY SECTION:. Ele contém a listagem de servidores DNS que podem atender sua consulta.
    3. Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo:

host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight>

    1. Quantos servidores DNS foram necessários consultar no total?
  1. Consultando um servidor explícito(@)
    dig @j.root-servers.net. +trace www.sj.ifsc.edu.br.
    
    1. Explique a diferença na consulta realizada por esse comando para o comando dig +trace www.sj.ifsc.edu.br. Em algum caso a consulta poderia ser exatamente a mesma? Qual?

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

Analisando o protocolo via Wireshark

Agora que já está ficando claro como funcionam as consultas DNS, deve-se investigar como se dá a comunicação entre seu computador e seu servidor DNS.

  1. abra o navegador web e limpe o cache do mesmo;
  2. abra o Wireshark e escolha a interface e inicie a captura de pacotes;
  3. inicie a captura de pacotes no Wireshark;
  4. no terminal digite dig +trace canon.jp (isso vai provocar a consulta DNS);
  5. pare a captura de pacotes;
  6. No Wireshark digite “dns” no filtro (sem as aspas);

Com base nisso identifique o seguinte:

  1. quantas mensagens são trocadas entre cliente e servidor DNS para cada consulta?
  2. que protocolo de transporte é usado?
  3. que portas de origem e destino são utilizadas?
  4. qual o formato das mensagens DNS? Elas são textuais como as mensagens HTTP?
  5. qual o tipo de registro DNS acessado em cada consulta?
  6. que informações estão contidas nas respostas DNS? Há algo além do que foi pedido?
  7. qual o tamanho das mensagens DNS?
  8. qual endereço IP a mensagem de consulta DNS é enviada? Foi o mesmo ip obtido na seção anterior: seu servidor DNS?
  9. examine a mensagem de consulta DNS. Qual o campo “type” desta mensagem?
  10. a mensagem de consulta contém algum campo “answer”?
  11. examine a mensagem de resposta DNS. Quantos campos com “answer” existem?
  12. quais são os benefícios de usar o UDP ao invés do TCP como protocolo de transporte para o DNS?

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>

Laboratório 4 - Entendendo 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.

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 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 eh 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.
  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 deseja 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.

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.

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

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.

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. Qual 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?

Comparativo.

  1. Quantas mensagens foram trocadas entre o servidor e cliente em cada um dos protocolos, UDP e TCP, para atingir o mesmo objetivo?
  2. Discuta outras diferenças observadas entre os protocolos UDP e TCP.

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.
Laboratório 5 - 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 no tipo de comunicação a ser feita pela aplicação.

Experimento 1

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:
      time nc -vvn ip_do_receptor 5555 < jogo.exe
      
    • Quando completar a transferência, 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. Qual o Tamanho Máximo de Segmento (MSS) escolhidos pelo cliente e servidor na conexão.
    5. É 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.
    6. Qual é o tamanho do último segmento de dados recebido?
    7. Todos os segmentos trocados entre as máquinas contém dados ou alguns são somente de controle? Qual o percentual aproximado de segmentos de controle?
    8. 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?
    9. 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:

./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?
    3. Há segmentos de controle ou somente segmentos de dados?
    4. Qual é o tamanho do último segmento de dados recebido?
  1. Compare as transferências feitas com os protocolos TCP e UDP.
    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?

Experimento 2

  • 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.
  • 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. Abra o NetKit2.
  2. Abra 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>

    • Copie o texto acima e, no Netkit, selecione o R1 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:

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. Pare os processos nos três PCs utilizando CTRL-C.
  2. Abra o Wireshark.
  3. 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

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.
    1. Quais são os 4 gráficos apresentados?
    2. Há uma relação de valor entre as curvas?
    3. 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. No PC3 execute:

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

  1. No PC1 execute:

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

  1. No PC2 execute:

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 -u -c 10.0.0.1 -f m -i 1 -t 60 -p 2002 -l 1300) & </syntaxhighlight>

  1. Fique monitorando o PC2 a tela parar de ser atualizada, aproximadamente 90 s. Pare os processos nos três PCs utilizando CTRL-C.
  2. Baseado na Figura 2, no Graph 4 altere o filtro para udp.port==2002. Salve o gráfico gerado.
  3. Responda as mesmas questões do item anterior, todas.
  4. Compare o comportamento dos vários fluxos de dados com e sem o UDP.

Experimento 3 (opcional)

Transferências usando cada um desses protocolos podem apresentar características bem distintas. Neste terceiro experimento, serão feitas transferências simultâneas de arquivos a partir de um mesmo servidor, comparando-se o resultado obtido com TCP e UDP. Essas transferência ocorrerão entre os computadores do laboratório e um servidor externo ao laboratório.

  1. Todos devem executar este procedimento ao mesmo tempo. Abra um terminal em seu computador, e nele execute este comando, só tecle <Enter> quando o professor determinar:
    wget http://tele.sj.ifsc.edu.br/~odilson/RED29004/arq2.iso
    
  2. Observe a taxa de transferência (velocidade do download) obtida. Que valores ela apresenta? Quanto tempo levou para o arquivo ser transferido?
  3. Após todos terem copiado o arquivo, o professor irá repetir a transferência, porém desta vez ele irá fazê-la sozinho. Que taxas ele obteve, e quanto tempo levou?
  4. O professor irá repetir a transferência novamente, mas desta vez ele irá pedir que um aluno também a inicie logo em seguida. Qual foi a taxa obtida por ambos?
  5. Para poder fazer uma comparação, as transferências serão feitas novamente porém usando UDP como protocolo de transporte. Para isso siga estes passos:
    1. Abra dois terminais. No terminal 1 execute este comando:
      watch -n 1 ls -l arquivo
      
      ... e no terminal 2:
      ./receptor 5555 > arquivo
      
    2. Fique observando o terminal 1.
    3. O professor irá transmitir o arquivo, um processo para cada aluno.
      • konsole
      • abrir várias abas
      • n vezes ./transmissor ip_do_receptor 5555 < jogo.exe
    4. No terminal 1 observe o tamanho do arquivo, que deverá aumentar gradativamente. Monitore manualmente o tempo em segundos até o tamanho do arquivo parar de crescer (relógio, celular ou relógio do computador).
    5. Em que valor o tamanho do arquivo parou de crescer? Quanto tempo isso levou, aproximadamente? O tamanho do arquivo recebido é o mesmo do arquivo original?
    6. Faça um comparativo das transferências usando TCP e UDP.

Tarefa extra (pode ser em casa)

Use o aplicativo NetCat (nc) para fazer transferências UDP e responda (utilize o man para os comandos, boa parte da respostas estão lá):

  1. Qual o procedimento no lado transmissor e receptor?
  2. Consegue-se medir o tempo de maneira automática? Por que sim ou por que não?
  3. Por que os processos não param ao final da transferência como no experimento 1?
Laboratórios 6 e 7 - 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.

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

DynamicRoutingTriangle.png