RED29004-2015-1

De MediaWiki do Campus São José
Ir para: navegação, pesquisa

Diário de aula de RED - 2015-1 - Prof. Odilson T. Valle

Dados Importantes

Professor: Odilson Tadeu Valle
Email: odilson@ifsc.edu.br
Atendimento paralelo: 2ª das 17h35 às 18h30 e 6ª das 9h40 às 10h35. Local: Lab. de Desenvolvimento.

  • Avaliações
    • 3 avaliações (P1, P2 e P3) mais um seminário (S).
    • Cada uma das avaliações terá terá um conceito numérico: 1, 2, ..., 9, 10. Conceito mínimo para não necessitar reavaliação: 6.
    • Um ou mais conceitos abaixo de 6 implica na realização da reavaliação: uma única a ser realizada no último dia de aula.

IMPORTANTE: o direito de recuperar uma avaliação em que se faltou somente existe mediante justificativa reconhecida pela coordenação. Assim, deve-se protocolar a justificativa no prazo de 48 horas, contando da data e horário da avaliação e aguardar o parecer da coordenação.

Conceitos Finais

Plano de Ensino

Planejamento de atividades
Aula Data Horas Conteúdo Recursos
1 4/2 2 Apresentação da disciplina Lab. Redes I, Projetor, Slides, Computadores
2 10/2 2 Introdução a Redes de Computadores Lab. Redes I, Projetor, Slides, Computadores
3 11/2 2 Introdução a Redes de Computadores Lab. Redes I, Projetor, Slides, Computadores
4 18/2 2 Comutação de Circuitos vs Computação de Pacotes Lab. Redes I, Projetor, Slides, Computadores
5 24/2 2 Modelos de serviço Lab. Redes I, Projetor, Slides, Computadores
6 25/2 2 Arquitetura em camadas Lab. Redes I, Projetor, Slides, Computadores
7 3/3 2 Uso de aplicações da Internet – Lab. 1 Lab. Redes I, Projetor, Slides, Computadores
8 4/3 2 Comunicação entre processos Lab. Redes I, Projetor, Slides, Computadores
9 10/3 2 Protocolos da Camada de Aplicação - Lab 2 – HTTP Lab. Redes I, Projetor, Slides, Computadores
10 11/3 2 Camada de aplicação: HTTP, FTP, SMTP Lab. Redes I, Projetor, Slides, Computadores
11 17/3 2 Camada de aplicação: DNS – Lab. 3 Lab. Redes I, Projetor, Slides, Computadores
12 18/3 2 Camada de aplicação: Lab. 3 – P2P Lab. Redes I, Projetor, Slides, Computadores
13 24/3 2 Correção das listas de exercícios (revisão) Lab. Redes I, Projetor, Slides, Computadores
14 25/3 2 Prova 1 (arquitetura em camadas, Internet, camada de aplicação) Sala de aula
15 31/3 2 Lab. 4 Lab. Redes I, Projetor, Slides, Computadores
16 1/4 2 Camada de transporte: serviços oferecidos Lab. Redes I, Projetor, Slides, Computadores
17 7/4 2 Serviço não orientado à conexão: UDP Lab. Redes I, Projetor, Slides, Computadores
18 8/4 2 Transferência confiável de dados Lab. Redes I, Projetor, Slides, Computadores
19 14/4 2 Construindo um protocolo de transferência confiável – Lab. 4 Lab. Redes I, Projetor, Slides, Computadores
20 15/4 2 Protocolos dutados: Volta-N e Retransmissão Seletiva, Controle de fluxo e congestionamento Lab. Redes I, Projetor, Slides, Computadores
21 22/4 2 Protocolos orientados a conexão: TCP Lab. Redes I, Projetor, Slides, Computadores
22 28/4 2 Lab. 5 Lab. Redes I, Projetor, Slides, Computadores
23 29/4 2 Correção das listas de exercícios (revisão) Lab. Redes I, Projetor, Slides, Computadores
24 5/5 2 Prova 2 (camada de transporte) Sala de aula
25 6/5 2 Redes datagrama e circuito virtual Lab. Redes I, Projetor, Slides, Computadores
26 12/5 2 Camada de rede: roteamento e encaminhamento Lab. Redes I, Projetor, Slides, Computadores
27 13/5 2 Endereçamento e roteamento estático no IP Lab. Redes I, Projetor, Slides, Computadores
28 19/5 2 Exercícios CIDR Lab. Redes I, Projetor, Slides, Computadores
29 20/5 2 Roteamento hierárquico e Sistemas autônomos na Internet Lab. Redes I, Projetor, Slides, Computadores
30 26/5 2 Roteamento hierárquico e laboratório de roteamento estático Lab. Redes I, Projetor, Slides, Computadores
31 27/5 2 Lab. 6 Lab. Redes I, Projetor, Slides, Computadores
32 2/6 2 Introdução à camada de enlace Lab. Redes I, Projetor, Slides, Computadores
33 3/6 2 Introdução à camada de enlace Lab. Redes I, Projetor, Slides, Computadores
34 9/6 2 Laboratório de enlaces (LAN) Lab. Redes I, Projetor, Slides, Computadores
35 10/6 2 Correção das listas de exercícios (revisão) Lab. Redes I, Projetor, Slides, Computadores
36 16/6 2 Prova 3 (camadas de rede e enlace) Sala de aula
37 17/6 2 Seminários Lab. Redes I, Projetor, Slides, Computadores
38 23/6 2 Seminários Lab. Redes I, Projetor, Slides, Computadores
39 24/6 2 Seminários Lab. Redes I, Projetor, Slides, Computadores
40 30/6 2 Prova de recuperação Sala de aula
TOTAL 80

Material de apoio

Applets do Kurose

Vários aplicativos com representação dinâmica de características das redes de computadores.

Listas de exercícios

Lista de exercícios 1
  1. Qual é a diferença entre um hospedeiro e um sistema final? Cite os tipos de sistemas finais. Um servidor web é um sistema final?
  2. O que caracteriza um protocolo? Dê um exemplo de um protocolo.
  3. Por que os padrões são importantes para os protocolos?
  4. O que é um programa cliente? O que é um programa servidor? Um programa servidor requisita e recebe serviços de um programa cliente?
  5. Quais são os dois tipos de serviços de transporte que a Internet provê às suas aplicações? Cite algumas características de cada um desses serviços.
  6. Quais são as vantagens de uma rede de comutação de circuitos em relação a uma rede de comutação de pacotes?
  7. Quais são os prós e contras da utilização de Circuitos Virtuais?
  8. Porque se afirma que a comutação de pacotes emprega multiplexação estatística? Compare a multiplexação estatística com a multiplexação que ocorre em TDM.
  9. A taxa de transmissão HFC é dedicada ou compartilhada entre os usuários? É possível haver colisões na direção do provedor – usuário de um canal HFC? Por quê?
  10. Cite cinco tecnologias de acesso. Classifique cada uma delas nas categorias acesso residencial, acesso corporativo ou acesso móvel.
  11. FTTH, HFC e ADSL são usados para acesso residencial. Para cada uma dessas tecnologias de acesso, cite uma faixa de taxas de transmissão e comente se a largura de banda é compartilhada ou dedicada.
  12. Considere o envio de um pacote de uma máquina de origem a uma de destino por uma rota fixa. Relacione os componentes do atraso que formam o atraso fim-a-fim. Quais deles são constantes e quais são variáveis?
  13. Porque dividimos a arquitetura da Internet em camadas?
  14. Quais são as cinco camadas da pilha de protocolo da Internet? Quais as principais responsabilidades de cada uma dessas camadas?
  15. O que é uma mensagem de camada de aplicação? Um segmento da camada de transporte? Um datagrama da camada de rede? Um quadro de camada de enlace? Qual a relação entre eles?
  16. Que camadas da pilha de protocolo da Internet um roteador implementa? Que camadas um comutador de enlace implementa? Que camadas um sistema final implementa?
Lista de exercícios 2 - Camada de Aplicação
  1. Relacione cinco aplicações da Internet não proprietárias e os protocolos da camada de aplicação que elas usam.
  2. Qual é a diferença entre arquitetura de rede e arquitetura de aplicação?
  3. De que modo um mensageiro instantâneo é um híbrido das arquiteturas cliente-servidor e P2P?
  4. Para uma sessão de comunicação entre um par de processos, qual processo é o cliente e qual é o servidor?
  5. Que informação é usada por um processo que está rodando em um hospedeiro para identificar um processo que está rodando em outro hospedeiro?
  6. Porque o HTTP, FTP, SMTP, POP3 e IMAP rodam sobre TCP e não sobre UDP?
  7. Qual é a diferença entre HTTP persistente com paralelismo e HTTP persistente sem paralelismo. Qual dos dois é utilizado pelo HTTP/1.1?
  8. Descreva como o cache Web pode reduzir o atraso na recepção de um objeto desejado. O cachê Web reduzirá o atraso para todos os objetos requisitados por um usuário ou somente para alguns objetos? Por quê?
  9. Porque o DNS não é centralizado?
  10. O que são consultas recursivas e interativas em uma consulta DNS?
  11. Por que se diz que o FTP envia informações de controle “fora da banda”?
  12. Suponha que Aline envie uma mensagem a Eduardo por meio de uma conta de e-mail da web (como o gmail), e que Eduardo acesse seu e-mail por seu servidor utilizando POP3. Descreva como a mensagem vai do hospedeiro Aline até o hospedeiro de Eduardo. Não se esqueça de relacionar a série de protocolos de camada de aplicação usados para movimentar as mensagens entre os hospedeiros.
  13. Em uma aplicação de compartilhamento de arquivos P2P, você concorda com a afirmação: ”não existe nenhuma noção de lados cliente e servidor de uma sessão de comunicação”? Por que sim ou por que não?
  14. Relacione alguns agentes de usuário de aplicação de rede que você utiliza no dia-a-dia.
  15. O que significa o protocolo de apresentação (handshaking protocol)?
  16. Considere um site de comércio eletrônico que quer manter um registro de compras para cada um de seus clientes. Descreva como isso pode ser feito com cookies.
  17. Imagine uma aplicação que requeira “não perda de dados” e seja também altamente sensível ao atraso.
Lista de exercícios 3 - Camada de Transporte
  1. Considere uma conexão TCP entre o hospedeiro A e o hospedeiro B. Suponha que os segmentos TCP que trafegam do hospedeiro A para o hospedeiro B tenham número de porta fonte x e número de porta destino y. Quais são os números de porta fonte e do destino para os segmentos que trafegam do hospedeiro B para o hospedeiro A?
  2. Descreva porque um desenvolvedor de aplicação pode escolher rodar uma aplicação sobre UDP em vez de sobre TCP.
  3. É possível que uma aplicação desfrute de transferência confiável de dados mesmo quando roda sobre UDP? Caso a resposta seja afirmativa, como isso acontece?
  4. Porque se diz que o TCP oferece comunicação lógica entre os processos de aplicação?
  5. Cite quais são os serviços oferecidos pelo protocolo TCP?
  6. O que são os serviços de multiplexação e demultiplexação implementados pela camada de transporte?
  7. Porque se diz que o UDP é um protocolo não orientado para conexão?
  8. Qual o papel das informações de porta origem e destino contidas nos segmentos TCP e UDP?
  9. Porque é dito que o TCP fornece transferência confiável de dados sobre um canal não confiável?
  10. Cite 3 diferenças entre os serviços oferecidos pelo TCP e UDP.
  11. O que é um timeout?
  12. Como é estabelecido o valor de timeout em uma conexão TCP? É um valor fixo?
  13. O que é um round trip time (RTT)? Escreva e descreva a equação.
  14. Para que serve um checksum em um segmento TCP ou UDP? Como ele é formado?
  15. Cite uma vantagem da abordagem Volta-N com relação à retransmissão seletiva.
  16. Cite uma vantagem da abordagem Retransmissão Seletiva com relação ao Volta-N.
  17. Qual é a grande desvantagem de uma transmissão do tipo “para e espera” com relação a uma do tipo “janelas deslizantes”?
  18. O que é um PDU (também chamado de Segmento)?
  19. O TCP oferece garantias de banda e de tempo real?
  20. Cite um motivo para um protocolo de transmissão confiável adicionar um número de seqüência em cada pacote transmitido. Justifique o uso dessa informação explicando o problema que ocorreria caso ela não fosse usada.
  21. Para que serve um relógio temporizador em um protocolo de transmissão confiável?
  22. Cite um problema que pode ocorrer caso o tempo de um relógio temporizador seja muito pequeno.
  23. Cite um problema que pode ocorrer caso o tempo de um relógio temporizador seja muito grande.
  24. Por quê os tempos dos relógios temporizadores não são estabelecidos de forma estática, e sim de forma dinâmica, calculados conforme os round-trip times medidos?
  25. O que é uma reconhecimento cumulativo?
  26. Explique o que faz um receptor caso receba um pacote fora de ordem em um protocolo do tipo:
    1. Volta-N e
    2. Retransmissão Seletiva.
  27. O que é um “Tamanho de Janela” em um protocolo do tipo Janela Deslizante? O que se leva em consideração para calcular seu valor?
  28. Em um protocolo de janela deslizante qual é um problema que pode acontecer quando o maior número de Seqüência é muito próximo do “Tamanho de Janela”?
  29. Responda verdadeiro e falso as seguintes perguntas e justifique resumidamente sua resposta:
    1. Com o protocolo SR, é possível o remetente receber um ACK para um pacote que caia fora de sua janela corrente.
    2. Com o protocolo GBN, é possível o remetente receber um ACK para um pacote que caia fora de sua janela corrente.
    3. O protocolo bit alternante é o mesmo que o protocolo SR com janela do remetente e destinatário de tamanho 1.
    4. O protocolo bit alternante é o mesmo que o protocolo GBN com janela do remetente e destinatário de tamanho 1.
  30. Considere a transferência de um arquivo enorme de L bytes do hospedeiro A para o hospedeiro B. Suponha um MSS de 536 bytes.
    1. Qual é o máximo valor de L tal que não sejam esgotados os números de sequência TCP? Lembre-se de que o campo de número de sequência TCP tem 4 bytes.
    2. Para o L que obtiver no item anterior, descubra quanto tempo demora para transmitir o arquivo. Admita que um total de 66 bytes de cabeçalho de transporte, de rede e de enlace de dados seja adicionado a cada segmento antes que o pacote resultante seja enviado por um enlace de 155 Mbits/s. Ignore controle de fluxo e controle de congestionamento de modo que A possa enviar segementos um atrás do outro e continuamente.
  31. Considere um canal que pode perder pacotes, mas cujo atraso máximo é conhecido. Modifique o protocolo rdt2.1 (livro ou transparências) para incluir esgotamento de temporização do remetente e retransmissão. Informalmente, argumente por que seu protocolo pode se comunicar de modo correto por esse canal.
  32. Dadas as máquinas de estado, figuras abaixo, de um transmissor e um receptor de um protocolo "qualquer". Faça um descrição do funcionamento de ambos. Monte pelo menos dois diagramas de mensagens, destacando e relacionando possíveis sequências temporais com as máquinas de estado dadas.
    Transmissor
    Receptor
  33. O UDP e TCP usam o complemento de 1 para suas somas de verificação. Suponha que você tenha as seguintes três palavras de 8 bits: 01010011, 01100110 e 01110100.
    1. Qual é o complemento de 1 para a soma dessas palavras? Mostre todo o trabalho.
    2. Por que o UDP toma o complemento de 1 da soma, isto é, por que não toma apenas a soma?
    3. Com o esquema de complemento de 1, como o destinatário detecta erros?
    4. É possível que o erro de 1 bit passe desapercebido?
    5. E um de 2 bits?
  34. Considere a figura abaixo (Variação do tamanho da janela). Admitindo-se que o TCP Reno é o protocolo que experimenta o comportamento mostrado no gráfico, responda às seguintes perguntas. Em todos os casos você deverá apresentar uma justificativa resumida para sua resposta.
    1. Quais os intervalos de tempo em que a partida lenta do TCP está em execução?
    2. Quais os intervalos de tempo em que a prevenção de congestionamento do TCP está em execução?
    3. Após a 16a rodada de transmissão, a perda de segmento será detectada por três ACKs duplicados ou por um esgotamento de temporização?
    4. Após a 22a rodada de transmissão, a perda de segmento será detectada por três ACKs duplicados ou por um esgotamento de temporização?
    5. Qual é o valor inicial de sstrhresh na primeira rodada de transmissão?
    6. Qual é o valor inicial de sstrhresh na 18a rodada de transmissão?
    7. Qual é o valor inicial de sstrhresh na 24a rodada de transmissão?
    8. Durante qual rodada de transmissão é enviado o 70o segmento?
    9. Admitindo-se que uma perda de pacote será detectada após 26a rodada pelo recebimento de três ACKs duplicados, quais serão os valores do tamanho da janela de congestionamento e de sstrhresh?
    10. Suponha que o TCP Tahoe seja usado (em vez do TCP Reno) e que ACKs duplicados triplos sejam recebidos na 16a rodada. Quais são o sstrhresh e o tamanho da janela de congestionamento na 19a rodada?
    11. Suponha novamente que o TCP Tahoe seja usado, e que exista um evento de esgotamento de temporização na 22a sessão. Quantos pacotes foram enviados da 17a sessão até a 22a, inclusive?
Variação do tamanho da janela
Lista de exercícios 4 - Camada de Rede
  1. Qual é o nome de um pacote da camada de rede? Os roteadores e comutadores da camada de enlace são denominados comutadores de pacotes. Qual é a diferença fundamental entre um roteador e um comutador de camada de enlace? Lembre-se de que usamos o termo roteadores tanto para redes de datagramas quanto para redes de circuitos virtuais.
  2. Quais são as principais características de uma rede de circuito virtual?
  3. Quais são as principais características de uma rede de datagramas? Porque os projetistas da Internet adoram este modelo de serviço em sua implementação?
  4. Porque se diz que a Internet implementa um serviço de melhor esforço? Que tipo de garantias são oferecidas neste modelo de serviço?
  5. Quais as principais diferenças entre os serviços oferecidos pelas redes de datagramas (Internet) e redes ATM?
  6. Quais são as funções mais importantes da camada de rede em uma rede de datagramas? Quais são as três funções mais importantes de rede em uma rede de circuitos virtuais?
  7. O que é um protocolo de roteamento?
  8. Como podem ser classificados os algoritmos de roteamento?
  9. Roteadores possuem endereços IP? Quantos endereços IP um roteador possui?
  10. Qual é a diferença básica entre protocolos de roteamento “Estado de Enlaces” e “Vetor de Distância”?
  11. Em uma rede largamente dispersa, com centenas de roteadores, você recomendaria a adoção de um protocolo de roteamento do tipo “Estado de Enlaces” ou “Vetor de Distâncias”? Justifique.
  12. Explique o funcionamento de um algoritmo de roteamento do tipo “Vetor de Distâncias”.
  13. A Internet usa o conceito de “roteamento hierárquico”. O que significa isso?
  14. Um roteador em uma rede de pacotes (como é o caso da Internet) pode eventualmente necessitar descartar um datagrama. Por que isso ocorre?
  15. Um roteador em uma rede de pacotes (como é o caso da Internet) pode eventualmente necessitar fragmentar um datagrama. Por que isso ocorre?
  16. O que é um Sistema Autônomo (AS)?
  17. Para que serve o protocolo ICMP?
  18. Para que serve o campo “Time to Live” (sobrevida) em um datagrama IP?
  19. Por que são usados protocolos inter-AS e intra-AS diferentes na Internet?
  20. Por que considerações políticas/econômicas não são tão importantes para protocolos intra-AS, como OSPF e RIP, quanto par um protocolo de roteamento inter-AS, como BGP?
  21. Quantos hosts podem ser endereçados com um bloco IP 200.23.16.0/20? Como podemos montar 8 sub-redes a partir deste bloco de endereços IP?
  22. Um provedor de serviços ISP possui cerca de 2000 clientes cadastrados atualmente. Porém um levantamento realizado recentemente pelo administrador da rede constatou que nunca mais do que 450 clientes estão on-line ao mesmo tempo. Qual o bloco de endereços IP na forma CIDR (a.b.c.d/x) deve ser contratado pelo ISP, considerando o estudo realizado pelo administrador da rede?
  23. Um administrador precisa montar uma rede experimental conforme mostrada na figura. Na sub-rede 1 ele precisará instalar cerca 25 hosts, e nas sub-redes 2 e 3 ele precisará instalar cerca de 12 hosts. O administrador dispõe do bloco de endereços IP 192.168.10.0/24 para ser utilizado no endereçamento da rede experimental. Faça uma proposta para alocação de endereços IP para cada sub-rede (rede 1, 2 e 3), incluindo também as sub-redes relativas aos enlaces ponto-a-ponto (rede AB, AC e BC). Responda ainda:
    1. Qual o endereço identificador de rede de cada sub-rede (1, 2 e 3)?
    2. Qual o a máscara de rede de cada sub-rede (1, 2 e 3)?
    3. Quais os endereços IP que serão atribuídos a cada interface de rede nos enlaces ponto-a-ponto dos roteadores (enlaces relativos as redes AB, AC e BC)CdrEx.png
  24. Suponha que um administrador de rede tenha recebido o bloco de endereços 200.40.8.0/21 e que deseja dividir este bloco em 8 blocos de endereços iguais, de menor tamanho, para ser alocado a 8 sub-redes administradas por ele.
    1. Determine o tamanho total do bloco de endereços.
    2. Determine o tamanho de cada sub-bloco.
    3. Determine o endereço/máscara de rede de cada sub-rede.
  25. Um provedor de acesso a Internet possui o seguinte bloco de endereços IP: 12.17.192.0/18. Os endereços IP de 12.17.192.1 até 12.17.207.255 já estão alocados para clientes deste provedor. Este provedor precisa atender a quatro novos clientes, um deles necessita de rede com pelo menos 1000 endereços de IP válidos e os outros três necessitam de rede com pelo menos 30 IP válidos. Faça uma proposta para alocação de endereços IP para estes clientes. Os endereços reservados para estes novos clientes devem ser alocados a partir da numeração mais baixa disponível. Procure também responder as questões abaixo:
    1. Qual o total de endereços que dispõe o provedor em questão?
    2. Quantos endereços IP já estão utilizados?
    3. Quantos endereços IP este provedor possui livres para alocar aos novos clientes?
    4. Qual o endereço identificador de cada sub-rede dos novos clientes?
    5. Qual o a máscara de rede de cada sub-rede dos novos clientes?
    6. Qual o endereço de broadcast de cada sub-rede dos novos clientes?
    7. Quantos endereços IP ainda sobrarão ao provedor após atender a estes clientes?
  26. Quantas estações uma rede 223.1.10.0/24 suporta?
  27. Uma rede com bloco de IPs 200.23.16.0/20 deseja montar 8 subredes. Mostre como isso é possível e como ficaria os endereços de cada uma dessas subredes.
  28. Um datagrama de 4000 bytes precisa ser fragmentado para passar por um roteador cujo enlace tem MTU de 1500 bytes. Mostre esquematicamente como ficam os datagramas que são gerados a partir dessa fragmentação.
  29. Considere enviar um datagrama de 2400 bytes por um enlace que tenha uma MTU de 700 bytes. Suponha que o datagrama original esteja marcado com o número de identificação 422. Quantos fragmentos são gerados? Quais são os valores em vários campos dos datagramas IPs gerados em relação à fragmentação?
  30. Um datagrama enviado para uma estação da mesma rede precisa passar por um roteador?
  31. Suponha que entre o hospedeiro de origem A e o hospedeiro de destino B os datagramas estejam limitados a 1500 bytes (incluindo cabeçalho). Admitindo um cabeçalho IP de 20 bytes, quantos datagramas seriam necessários para enviar um arquivo MP3 de 5 milhões de bytes? Explique como você obteve a resposta.
  32. Qual é a diferença básica de um endereço IP baseado em classes cheias (classful) e um sem classes (classles – CIDR)?
  33. Descreva e detalhe o processo de obtenção de um endereço IP através do protocolo DHCP.
  34. Descreva e detalhe o processo de tradução de endereços de rede - NAT. Com o NAT é possível somente a conversão (troca) do número de portas? Explique.
  35. Compare os campos de cabeçalho do IPv4 e do IPv6e aponte suas diferenças. Eles tem algum campo em comum?
  36. Afirma-se que, quando o IPv6 implementa túneis via roteamento IPv4, o IPv6 trata os túneis IPv4 como protocolo de camada de enlace. Você concorda com essa afirmação? Explique sua resposta.
  37. Cite as diferenças entre a execução da abstração de difusão por meio de múltiplas transmissões individuais e a de uma única difusão com suporte da rede (roteador).
  38. Considere uma rede de datagramas que utiliza endereços de hospedeiros de 8 bits. Suponha que um roteador utilize a correspondência do prefixo mais longo e tenha a seguinte tabela de repasse:
    Prefixo a compararInterface
    10
    101
    1112
    senão3
    Para cada uma das quatro interfaces, forneça a faixa associada de endereços de hospedeiro de destino e o número de endereços na faixa.
Lista de exercícios 5 - Camada de Enlace
  1. Quais são os serviços providos pela camada de enlace?
  2. Dentre os serviços de camada de enlace, quais obrigatoriamente precisam ser implementados por todos os protocolos de enlace?
  3. Porque é necessário sincronizar quadros (serviço de enquadramento)?
  4. Por que se faz necessário um protocolo de acesso ao meio (MAC), em redes com meio de transmissão compartilhado?
  5. Do ponto de vista do protocolo MAC CSMA/CD, qual a principal diferença entre hubs e switches?
  6. Se as redes Ethernet atualmente podem operar com switches (Ethernet comutada), e em modo fullduplex, porque ainda existe o protocolo MAC CSMA/CD?
  7. Switches Ethernet Gerenciáveis são equipamentos de comutação de pacotes que podem ser configurados e observados pelos administradores de redes. Entre as informações que um administrador de rede tem acesso em um switch destes está a relação de endereços MAC conectados em cada porta do equipamento. Um administrador de rede detectou que existe um computador inundando a rede com tráfego intenso (o que pode ser causado por um virus). No entanto, ao capturar alguns dos datagramas IP desse fluxo intenso, o administrador não conseguiu reconhecer o endereço IP do computador, uma vez que ele varia entre diferentes datagramas (uma técnica para camuflar sua origem). Porém ele notou que o endereço MAC de origem, contido nos respectivos quadros Ethernet, é sempre o mesmo, o que identifica o computador que emite este tráfego. Sabendo que a rede é composta de vários switches Ethernet gerenciáveis, como o administrador poderia, sem sair de sua sala, localizar rapidamente esse computador?
  8. Um pacote de uma camada superior de redes é dividido em 10 quadros, e cada quadro tem 80% de chances de chegar sem danos. Se o protocolo de enlace de dados não fizer qualquer controle de erros, quantas vezes em média a mensagem deverá ser enviada para que o processo inteiro seja concluído?
  9. Explique o que é colisão e como estas impactam o tráfego de uma rede Ethernet. Explique como a mesma é evitada em redes comutadas, explicando como o uso de switches limitam as colisões quando comparados com hubs ou barramentos.
  10. Por que uma pesquisa ARP é enviada dentro de um quadro broadcast? Por que uma resposta ARP é enviada dentro de um quadro com endereço MAC específico? Qual é a diferença entre esses dois quadros?
  11. Compare as estruturas de quadros das redes Ethernet 10BaseT, 100BaseT e Gigabit Ethernet. Quais diferenças entre elas?
  12. Dois adaptadores, um com taxa nominal de 10001 bps e outro com taxa nominal de 9999 bps, estão conectados via par trançado, como eles conseguem trocar dados normalmente?
  13. Você comprou um notebook novo. Vai utilizar pela primeira vez no Câmpus São José do IFSC. Com um cabo de rede conectou seu computador à rede do IFSC e digitou no navegador de seu computador: www.polito.it. Cite todos os protocolos utilizados e todas a etapas cumpridas por seu computador, para que essa operação tenha exito.

Transparências utilizadas durante as aulas

Slides do Kurose referentes ao capítulo 1

Slides do Kurose referentes ao capítulo 2

Slides do Prof. Emerson - DNS, FTP, Web, Email...

Slides do Kurose referentes ao capítulo 3

Slides do Kurose referentes ao capítulo 4

Slides do Kurose referentes ao capítulo 5

Roteiros para laboratório

Laboratório 1 -- Ping, traceroute e Wireshark

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. Neste laboratório, exploraremos vários aspectos do protocolo HTTP: a interação básica GET/resposta do HTTP, formatos de mensagens HTTP, baixando arquivos grandes em HTML, baixando arquivos em HTML com objetos incluídos, e autenticação e 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. inicie o Wireshark, como descrito no Laboratório 1 (mas não inicie a captura de pacotes ainda). Digite “http.request or http.response” (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);
  3. inicie a captura de pacotes
  4. digite o seguinte URL no navegador http://www.sj.ifsc.edu.br/~odilson/RED29004/RED29004.html
  5. pare a captura de pacotes.
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, 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.

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 linguagens (se alguma) o seu navegador indica que pode aceitar ao servidor?
  4. Qual o endereço IP do seu computador?
  5. E do servidor www.sj.ifsc.edu.br?
  6. Qual o número da porta utilizada no seu computador?
  7. E do servidor www.sj.ifsc.edu.br?
  8. Qual o endereço MAC do seu computador?
  9. E do servidor de destino (Dst)? Nesse caso o servidor de destino e o servidor www.sj.ifsc.edu.br são o mesmo host?
  10. Qual o código de status retornado do servidor para o seu navegador?
  11. Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?
  12. Quantos bytes de conteúdo são baixados pelo seu navegador?

Repita as respostas e procedimentos para a mensagem de resposta do HTTP. Responda ainda:

  1. Qual a diferença entre os endereços (IP, porta, MAC) de origem e destino entre a mensagem GET e a de resposta do HTTP?


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;
  3. inicie o Wireshark;
  4. digite o URL no navegador http://www.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 www.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

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://www.sj.ifsc.edu.br/~odilson/RED29004/RED29004_arq2.html seu navegador deve exibir um documento bastante longo e criativo :) ;
  5. 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 9 "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://www.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. A imagem da esquerda, redesWL_network.jpeg, está em ibxk.com.br. A imagem da direita, as-redes-sociais-como-instrumento-de-manipulacao-da-consciencia-coletiva.html.jpg, está em lounge.obviousmag.org;
  5. 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?
  2. Para quais endereços na Internet estas mensagens foram enviadas?
  3. Você consegue dizer se o seu navegador baixou as duas imagens em seqüência, ou se foram baixadas dos dois locais distintos em paralelo? Explique.

Autenticação HTTP

Finalmente, vamos tentar visitar um local na web que é protegido por senha e examinar a seqüência de mensagens HTTP trocadas com este local. O URL http://www.sj.ifsc.edu.br/~odilson/RED29004/Seguro/ é protegido por senha. O usuário é “red29004” (sem as aspas), e a senha é “seguro” (novamente, sem as aspas). Então vamos acessar o local protegido por senha. 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://www.sj.ifsc.edu.br/~odilson/RED29004/Seguro/ seu navegador apresentará um pop up solicitando usuário e senha;
  5. forneça usuário e senha e o navegador apresentará uma "linda" página já conhecida;
  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.

Agora vamos examinar a saída do Wireshark. Você pode querer primeiro ler sobre a autenticação HTTP revisando o material fácil de ler (em inglês) HTTP Access Authentication Framework

Responda às seguintes questões:

  1. Qual é a resposta do servidor (código de status e frase) para a primeiro mensagem HTTP GET do seu navegador?
  2. Quando o seu navegador envia a mensagem HTTP GET pela segunda vez, qual o novo campo que está incluído na mensagem?

O nome de usuário (red29004) e a senha (seguro) que você digitou foram codificados na cadeia de caracteres (cmVkMjkwMDQ6c2VndXJv) após o cabeçalho “Authorization: Basic” na mensagem HTTP GET (primeira). Parece que o nome e senha estão criptografados, mas na verdade estão simplesmente codificados em um formato denominado Base64. O nome do usuário e a senha não estão criptografados! Para ver isso, vá para https://www.base64decode.org/ e digite o texto cmVkMjkwMDQ6c2VndXJv e pressione DECODE. Voilá! Você traduziu de Base64 para ASCII, e desta forma consegue ver o nome de usuário e a senha! Sabendo que alguém pode baixar o Wireshark e capturar pacotes (não somente os próprios), e alguém pode traduzir de Base64 para ASCII (você acabou de fazê-lo!), deve estar claro para você que o uso de senhas apenas em locais na web não garantem segurança, a não ser que medidas adicionais sejam tomadas. Não tema! Há meios de fazer o acesso WWW ser mais seguro. Contudo, nós claramente precisamos de algo que vá além do framework básico de autenticação HTTP!

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 URL no navegador https://www.base64decode.org/ seu navegador apresentará um site já apresentado/utilizado;
  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?
Laboratório 3 - Serviço de Nomes (DNS)

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 de mais perto inicialmente o lado cliente do DNS, uma pequena análise do protocolo e no final uma breve introdução ao servidor DNS. 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.

Consultas DNS por meio de ferramentas especializadas

  1. Usando o programa host, Nslookup ou dig, descubra os endereços IP associados aos seguintes nomes de domínios:
    • mail.ifsc.edu.br
    • www.sj.ifsc.edu.br
    • www.google.com
    • www.gmail.com
    • www.amazon.co.uk
    • www.gov.za
    • www.sls.com.au
  2. Agora descubra 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 isso pode ser feito assim:
    host -t ns ifsc.edu.br
    dig -t ns ifsc.edu.br
    
  3. Descubra 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. Uma outra ferramenta pode ser utilizada nesse caso: host. Por exemplo:
    host -t mx ifsc.edu.br
    dig -t mx ifsc.edu.br
    
    Descubra quem é o servidor que recebe emails nos seguintes domínios:
    • gmail.com
    • hotmail.com
    • uol.com.br
    • ufsc.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.180.10.13
    
    ... 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.180.10.13 +short </syntaxhighlight>

  1. Como explicado durante a aula, 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?
    1. Descubra quem são os servidores raiz (topo de hierarquia DNS):
      host -t ns .
      dig -t ns .
      
    2. Escolha um dos servidores 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 foi necessário consultar no total?
    2. Repita esse exercício para os seguintes nomes de domínio:
      • www.bbc.co.uk
      • www.amazon.com
      • www.thepiratebay.org
      • www.reeec.illinois.edu
      • www.inm.ras.ru
  1. Consultando um servidor explícito(@)
    dig @j.root-servers.net. +trace www.sj.ifsc.edu.br.
    
  2. Faça uma consulta recursiva com dig e responda:
    dig +trace mail.ru.
    
    1. Qual foi o RLD consultado?
    2. Qual o TLD consultado?
    3. Qual o SLD consultado?
    4. Como você sabe que foram esses os LDs consultados?

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 digite “dns” no filtro (sem as aspas);
  3. inicie a captura de pacotes no Wireshark;
  4. no navegador web, visite a página http://canon.jp/ (isso vai provocar a consulta DNS);
  5. pare a captura de pacotes.

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?

Do lado de lá do balcão: servidor de nomes

DNS (Domain Name System) é uma base de dados distribuída e hierárquica. Nela se armazenam informações para mapear nomes de máquinas da Internet para endereços IP e vice-versa, informação para roteamento de email, e outros dados utilizados por aplicações da Internet.

A informação armazenada no DNS é identificada por nomes de domínio que são organizados em uma árvore, de acordo com as divisões administrativas ou organizacionais. Cada nodo dessa árvore, chamado de domínio, possui um rótulo. O nome de domínio de um nodo é a concatenação de todos os rótulos no caminho do nodo até a raiz. Isto é representado como uma string de rótulos listados da direita pra esquerda e separados por pontos (ex: ifsc.edu.br, sj.ifsc.edu.br). Um rótulo precisa ser único somente dentro do domínio pai a que pertence.

Por exemplo, um nome de domínio de uma máquina no IFSC pode ser mail.ifsc.edu.br., em que o "." (último) significa o root level domain .br é o domínio do topo da hierarquia (no Brasil feito em [1]) ao qual mail.sj.ifsc.edu.br pertence. .ifsc.edu é um subdomínio de .br., e mail o nome da máquina em questão.

Por razões administrativas, o espaço de nomes é dividido em áreas chamadas de zonas, cada uma iniciando em um nodo e se estendendo para baixo para os nodos folhas ou nodos onde outras zonas iniciam. Os dados de cada zona são guardados em um servidor de nomes, que responde a consultas sobre uma zona usando o protocolo DNS.

Clientes buscam informação no DNS usando uma biblioteca de resolução (resolver library), que envia as consultas para um ou mais servidores de nomes e interpreta as respostas.

Hierarquia-DNS.gif

(tirado do manual do BIND9)

Ver também o livro sobre DNS e BIND da O'Reilly.

Roteiro de atividades

Como não temos condições de criar registros em registro.br, para testarmos algumas funcionalidades de um servidor DNS, vamos montar uma estrutura parcial, válida somente dentro do laboratório, onde poderemos fazer algumas configurações básicas e testá-las. O objetivo é montar a seguinte estrutura que é composta por um ramo (professor) e algumas folhas (alunos) de uma árvore DNS, ver Fig. 1.

Fig.1 -- Ramo DNS para testes.

Vamos configurar e testar um servidor DNS. Para tanto montaremos a estrutura indicada no diagrama, onde cada máquina será um servidor DNS, com um domínio próprio e, ao mesmo tempo, será cliente do servidor DNS da máquina 192.168.1.101. Esta, por sua vez, será servidor master do domínio r1.br e servidor escravo dos domínios criados por vocês, recebendo automaticamente uma cópia das zonas desses servidores masters. Esta, será também a única máquina com servidor DNS com zona reversa. Sendo assim todos os domínios, diretos e reversos, serão visíveis por meio deste servidor. Como, apesar de serem servidores DNS, todas as máquinas, enquanto clientes, utilizam a máquina do professor para resolver nomes, todos se enxergarão mutuamente.

Procedimento:

  1. Abra o VirtualBox e inicie a máquina RES-grafico.
  2. Logue como aluno/aluno.
  3. Abra um terminal e tome permissões de root: sudo su / aluno.
  4. Configure sua interface de rede com IP estático, removendo o cliente dhcp. Y é obtido pelo número da etiqueta de sua máquina: D2 ==> Y = 02, D3 ==> Y = 03, ..., D9 ==> Y = 09, E1 ==> Y = 11, E2 ==> Y = 12, ..., E8 ==> Y = 18:

apt-get remove isc-dhcp-client ifconfig eth0 192.168.1.1Y route add -net default gw 192.168.1.1 gedit /etc/resolv.conf (acrescente ao final do arquivo, deve ser a única linha descomentada)

  nameserver 192.168.1.101 </syntaxhighlight>
    • Se ocorrer erro ao configurar a eth0 tente com eth1, eth2...
  1. Acesse a Wiki com o navegador de sua máquina virtual. Isso permitirá você copiar e colar os textos/comandos abaixo.
  2. Atualize a base de pacotes e instale o pacote Bind:

apt-get update apt-get install bind9 </syntaxhighlight>

  1. Edite o arquivo de definição local, gedit /etc/bind/named.conf.local, e acrescente ao final do arquivo (pode deixar os comentários iniciais já existentes) o seguinte conteúdo, não deixando espaço em branco antes da primeira e última linha (XX é igual a etiqueta de sua máquina, D2, D3, ..., E1, E8):

zone "XX.br" {

 type master;
 file "/etc/bind/db.XX";
 allow-transfer {
   192.168.1.101;
 };

};</syntaxhighlight>

  1. Edite/crie o arquivo de zona, gedit /etc/bind/db.XX, e deixe-o do seguinte modo

$TTL 86400 @ IN SOA ns.XX.br. admin.XX.br. (

                             2015032400; serial
                             3H ; refresh
                             60 ; retry
                             1W ; expire
                             3W ; minimum
                            )

@ IN NS ns.XX.br. ; este é o servidor master deste domínio @ IN MX 10 mail.XX.br. $ORIGIN XX.br. ns A 192.168.1.1Y www CNAME ns mail A 192.168.1.1Y </syntaxhighlight>

  1. Utilize a ferramenta para teste de validade do arquivo de definição de zona: named-checkzone XX.br /etc/bind/db.XX. Caso apresente erros corrija-os.
  2. Utilize a ferramenta testar as configuração do BIND: named-checkconf -z. Caso apresente erros corrija-os.
  3. Reinicie o serviço: service bind9 restart. Verifique ainda possíveis erros:

tail -n 30 /var/log/syslog </syntaxhighlight>

  1. Caso tudo esteja certo avise ao professor para atualizar as cópias dos arquivos de zona.
  2. Faça a seguinte sequência de testes:
    ping www.XX.br
    ping mail.XX.br
    dig @localhost mail.XX.br
    dig @192.168.1.101 nome_de_maquina_de_algum_colega
    dig XX.br ANY
    
  3. Teste o DNS reverso com o IP de sua máquina e de seus colegas, usando a ferramenta “dig”:
    dig -x 192.168.1.1Y
    
  4. Vamos acrescentar mais um IP e um nome de máquina em nosso servidor:

ifconfig eth0:0 192.168.1.2Y </syntaxhighlight>

    • ou eth1:0, eth2:0 ...
  1. Acrescente ao final do arquivo /etc/bind/db.XX a declaração do novo componente em nossa tabela de nomes. Obrigatoriamente o valor do serial deve ser incrementado de pelo menos 1 unidade.

seu_nome_de_batismo A 192.168.1.2Y</syntaxhighlight>

  1. Reinicie o BIND e avise ao professor para atualizar a cópia.
  2. Faça testes:

ping seu_nome_de_batismo.XX.br ping nome_do_seu_colega.XX.br  ;aqui o XX é do seu colega. </syntaxhighlight>

  1. Questões para o relatório:
    1. Explique cada uma das linhas do arquivo /etc/bind/db.XX.
    2. Explique a seção allow-transfer { 192.168.1.101; }; do arquivo /etc/bind/named.conf.local.
    3. Compare o seu arquivo /etc/bind/named.conf.local com o do professor (abaixo).
    4. Compare os arquivos /etc/bind/db.r1 com /etc/bind/db.db.1.168.192, abaixo.

Arquivos e procedimentos na máquina Professor, somente para exemplificar

apt-get update
apt-get install bind9
mkdir /var/cache/bind/slaves
chown bind:bind /var/cache/bind/slaves

/etc/bind/named.conf.local // // Do any local configuration here //

// Consider adding the 1918 zones here, if they are not used in your // organization //include "/etc/bind/zones.rfc1918";

zone "r1.br" {

       type master;
       file "/etc/bind/db.r1";

}; zone "1.168.192.in-addr.arpa" IN {

       type master;
       file "/etc/bind/db.1.168.192";

};

zone "D2.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D2";
       masters { 192.168.1.102; };

};

zone "D3.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D3";
       masters { 192.168.1.103; };

};

zone "D4.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D4";
       masters { 192.168.1.104; };

};

zone "D5.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D5";
       masters { 192.168.1.105; };

};

zone "D6.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D6";
       masters { 192.168.1.106; };

};

zone "D7.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D7";
       masters { 192.168.1.107; };

};

zone "D8.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D8";
       masters { 192.168.1.108; };

};

zone "D9.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.D9";
       masters { 192.168.1.109; };

};

zone "E1.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E1";
       masters { 192.168.1.111; };

};

zone "E2.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E2";
       masters { 192.168.1.112; };

};

zone "E3.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E3";
       masters { 192.168.1.113; };

}; zone "E4.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E4";
       masters { 192.168.1.114; };

};

zone "E5.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E5";
       masters { 192.168.1.115; };

};

zone "E6.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E6";
       masters { 192.168.1.116; };

}; zone "E7.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E7";
       masters { 192.168.1.117; };

}; zone "E8.br" IN {

       type slave;
       file "/var/cache/bind/slaves/db.E8";
       masters { 192.168.1.118; };

}; </syntaxhighlight> /etc/bind/db.r1

BIND reverse data file for empty rfc1918 zone
DO NOT EDIT THIS FILE - it is used for multiple zones.
Instead, copy it, edit named.conf, and use that copy.

$TTL 86400 @ IN SOA m1.r1.br. admin.r1.br ( 2015032400 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL

@ IN NS ns.r1.br. @ IN MX 10 mail.r1.br. $ORIGIN r1.br. ns A 192.168.1.101 www CNAME ns mail CNAME ns </syntaxhighlight>

/etc/bind/db.1.168.192 (Zona reversa) $TTL 86400 @ IN SOA m1.X1.br. root ( 2015032400 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL

       IN      NS      mail.r1.br.

101 IN PTR mail.r1.br. 102 IN PTR mail.D2.br. 103 IN PTR mail.D3.br. 104 IN PTR mail.D4.br. 105 IN PTR mail.D5.br. 106 IN PTR mail.D6.br. 107 IN PTR mail.D7.br. 108 IN PTR mail.D8.br. 109 IN PTR mail.D9.br. 111 IN PTR mail.E1.br. 112 IN PTR mail.E2.br. 113 IN PTR mail.E3.br. 114 IN PTR mail.E4.br. 115 IN PTR mail.E5.br. 116 IN PTR mail.E6.br. 117 IN PTR mail.E7.br. 118 IN PTR mail.E8.br. </syntaxhighlight>

Laboratório 4 - Programação de sockets

Objetivo principal: entender o conceito de sockets.

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.

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.

Um exemplo de código bem simples para o lado Cliente:

UDPClient.py

  1. 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

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>

O código do lado do Servidor (comentários somente nas linhas inéditas):

UDPServer.py from socket import * serverPort = 22222 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 contatos por clientes

while 1:

message, clientAddress = serverSocket.recvfrom(2048)

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

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


Para testar se o servidor está com a "porta aberta" podemos utilizar o aplicativo nmap, que procura por portas abertas. Como exemplo vamos verificar somente se a porta 22222 UDP (-sU) está aberta:

sudo nmap -p22222 -sU numero_do_ip_do_servidor

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

Um exemplo de código bem simples para o lado Cliente (comentários somente nas linhas inéditas):

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>

O código do lado do Servidor (comentários somente nas linhas inéditas): 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) messageMaiuscula = message.upper() connectionSocket.send(messageMaiuscula) connectionSocket.close() </syntaxhighlight>

Teste do servidor:

nmap -sT -p33333 ip_do_servidor

Roteiro de atividades

  1. Ligue a máquina virtual RES-grafico
  2. Logue com: aluno - aluno
  3. Configure sua interface de rede com IP estático, removendo o cliente dhcp. Y é obtido pelo número da etiqueta de sua máquina: D2 ==> Y = 02, D3 ==> Y = 03, ..., D9 ==> Y = 09, E1 ==> Y = 11, E2 ==> Y = 12, ..., E8 ==> Y = 18:

apt-get remove isc-dhcp-client ifconfig eth0 192.168.1.1Y route add -net default gw 192.168.1.1 gedit /etc/resolv.conf (acrescente ao final do arquivo, deve ser a única linha descomentada)

  nameserver 200.135.37.65 </syntaxhighlight>
  1. Escreva o programa UDPServer.py nessa máquina e execute-o:

python UDPServer.py </syntaxhighlight>

  1. Se apresentar erros de sintaxe corrija-os
  2. Teste com o nmap para verificar se a porta está aberta.
  3. Abra um terminal da máquina real e escreva o programa UDPClient.py. Não se esqueça de adequar o endereço IP. Execute-o.
  4. Sucesso na execução do programa?
  5. Rode o WireShark, seguindo o modelo apresentado no RED29004-2015-1#Roteiros_para_laborat.C3.B3rio
  6. Execute novamente o cliente e servidor e capture os pacotes com o WireShark. Use um filtro do tipo: ip.addr == ip_do_servidor, assim captura-se somente os pacotes originados/destinados ao servidor. É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?
  7. Repita os passos 4 a 10, só que agora para o protocolo TCP.
  8. Discuta as diferenças observadas entre os protocolos UDP e TCP.
  9. Com seu cliente conecte o servidor UDP e TCP de seu colega e vice-versa. Capture com o WireShark a mensagens trocadas. Alguma diferença? Quais?

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

O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.

Experimento 1

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 feita dependendo do tipo de comunicação a ser feita pela aplicação. Por exemplo, 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/ubuntu.iso
    
  2. Observe o tamanho do arquivo transferido ... ele deve ter exatamente 1028653056 bytes (cerca de 981 MB). Você pode fazer isso com o comando ls -l ubuntu.iso, 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.
  4. A primeira transferência será feita usando o protocolo TCP da seguinte forma:
    • No computador receptor execute o netcat (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:
      time nc -vvn ip_do_receptor 5555 < ubuntu.iso
      
    • Quando completar a transferência, verifique o tamanho do arquivo recebido. Ele é igual ao arquivo original? E quanto tempo levou para transmiti-lo?
  5. A segunda transferência será feita usando o protocolo UDP:
    • 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
      ./transmissor ip_do_receptor 5555 < ubuntu.iso
      
    • Quando completar a transferência, no receptor digite <CTRL + C>, verifique o tamanho do arquivo recebido. Ele é igual ao arquivo original? E quanto tempo levou para transmiti-lo?
  6. Compare as transferências feitas com TCP e UDP. O que eles têm em comum? Que diferenças lhe pareceram mais pronunciadas? Como isso deve afetar as aplicações que usam esses protocolos?

Experimento 2

Transferências usando cada um desses protocolos podem apresentar características bem distintas. Neste segundo 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:
    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. Finalmente, o professor irá repetir a transferência porém com três alunos fazendo-a ao mesmo tempo. Que se pode concluir quanto a taxa de transferência obtida?
  6. 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. O professor irá transmitir o arquivo a partir do servidor remoto, um processo para cada aluno. No terminal 1 observe o tamanho do arquivo, que deverá aumentar gradativamente. Monitore manualmente o tempo em segundos (relógio, celular ou relógio do computador), o tamanho e quando o tamanho do arquivo parou de crescer.
    3. Em que valor o tamanho do arquivo parou de crescer? Quanto tempo isso levou, aproximadamente? E esse tamanho final é o mesmo do arquivo original?
    4. Como se comportaram as transferências usando TCP e UDP?

Experimento 3

Repita os passos 1 e 3 do experimento 2 (anterior) mas agora com o arquivo minimo.txt, anotando todos os tempos.

  1. Os resultados foram os esperados? Discuta sobre as possíveis diferenças de comportamento.

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ório 6 - Protocolos de roteamento

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

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

Experimento 1: tabelas estáticas de roteamento

Tempo aproximado para execução e conferência: 1 h

  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. 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 5.2 e 5.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). Qual a origem e destino dos pacotes? Por quê? Qual a diferença no ping entre os dois itens?
  5. Iniciando o roteamento
    1. Deixe o ping do item 5.3 e o wireshark do item 5.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ê?
    2. Em todos os roteadores crie rotas para todas as redes. Se tudo estiver correto, todos os PCs devem pingar entre si. Teste!
  6. Testando a queda de enalce.
    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?

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

Experimento 2: protocolo de roteamento RIP

Tempo aproximado para execução e conferência: 40 min

Baseado no mesmo diagrama do experimento anterior, usaremos serviços para rodar os protocolos de roteamento RIP e OSPF 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).

  1. Reinicie o NetKit2 e releia o arquivo de configuração exp1.conf.
  2. Repita o item 5.4 do Experimento 1.
  3. 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". Nesta pasta, há uma pasta para cada equipamento da rede em teste. 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. O arquivo de configuração abaixo mostra a configuração do Quagga para o roteador r1. Salve este arquivo com o nome zebra.conf no diretório lab/r1/. 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
    
  4. Crie os arquivos de configuração para o RIP em cada roteador, colocando-os dentro dos diretórios dos mesmos. 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
    
  5. No pc1 execute: ping 192.168.2.1 </syntaxhighlight> O ping está funcionando? Por quê?
  6. Deixe o ping rodando!
  7. Inicie o daemon quagga em todos os roteadores (r1, r2 e r3). service quagga start </syntaxhighlight>
  8. Execute o Quagga e o RIP a partir dos arquivos criados. Os arquivos que estão na pasta "/home/USUARIO/lab" são montados na pasta "/homelab/" 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
    ripd -d -f /hostlab/r1/ripd.conf
    
  9. Olhe o terminal do pc1, o que ocorreu com o ping? Por quê?
  10. 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>
  11. Teste as demais conectividades entre os PCs com ping mútuos. Tudo funcionando?
  12. A partir de cada PC trace a rota (traceroute) para os demais PC e anote-as.
  13. Com o route -n e/ou netstat -r verifique a anote as rotas de cada roteador.
  14. Pare todos os pings.
  15. Execute o WireShark (ou tcpdump -n -vvv -i any) no r1 por pelo menos 1 min e tente compreender as mensagens RIPv2 (UDP 17) trocadas. Olhe com atenção os IPs e as métricas apresentadas. O que dizem essas mensagens?
  16. Com o WireShark rodando em r1, desative um dos enlaces entre os roteadores e acompanhe a troca de mensagens. Por questões de compatibilidade vamos desativar uma interface de um modo especial. Por exemplo, para "derrubar" o enlace r1-r2, execute no r1:

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

  1. Permaneça monitorando o ping e o Wireshark, a recuperação das rotas leva em torno de 1 min. Quais as mensagens trocadas no WireShark?
  2. Teste as conectividades. O que aconteceu?
  3. Retrace as rotas com show ip route nos roteadores e com o traceroute a partir dos PCs. São diferentes do caso original (todos enlaces ativos)? Por quê?

Experimento 3: protocolos e roteamento OSPF

Tempo aproximado para execução e conferência: 30 min

  1. Reinicie o NetKit2 para limpar todas as configurações.
  2. Crie em seu computador um arquivo com nome /home/aluno/exp2.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. 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 2.
  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/USUARIO/lab" são montados na pasta "/homelab/" 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. Quais as conclusões?
  2. As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?
  3. Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Por quê?
Laboratório 7 - IPv6

Este roteiro foi baseado no material disponível em [2].

Slides de endereçamento IPv6.

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

Objetivos do laboratório:

  • Conhecer o protocolo IPv6
  • Compreender o funcionando do Neighbor Discovery
  • Aprender a configurar redes IPv6 no Linux
  • Aprender a configurar rotas IPv6

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 IP que utilizaremos em nosso experimento.

Diagrama rede IPv6.jpg

Procedimento:

  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. Routers definitions

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

  1. Hosts' interfaces to local routers

pc1[eth0]=link0 pc2[eth0]=link1


r1[eth0]=backbone0 r1[eth1]=link0 r1[eth2]=link1

r2[eth0]=backbone0 r2[eth1]=HUB1


pc3[eth0]=HUB1 pc4[eth0]=HUB1


  1. Definicao da quantidade de memoria disponivel para cada pc.

pc1[mem]=32 pc2[mem]=32 pc3[mem]=32 pc4[mem]=32 r1[mem]=64 r2[mem]=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. Abrirá uma janela com 6 abas, onde cada uma delas é um terminal de configuração do respectivo equipamento: pc1-4 ou r1-2.
  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. Em todos os equipamentos, iremos iniciar a captura de pacotes em uma das interfaces que será gravado em um arquivo para estudo posterior. Utilize os seguintes comandos (atenção ao "&" no final que envia o tcpdump para background):
    1. pc1: tcpdump -i eth0 -w /hostlab/ipv6_pc1.pcap &
    2. pc2: tcpdump -i eth0 -w /hostlab/ipv6_pc2.pcap &
    3. pc3: tcpdump -i eth0 -w /hostlab/ipv6_pc3.pcap &
    4. pc4: tcpdump -i eth0 -w /hostlab/ipv6_pc4.pcap &
    5. r1: tcpdump -i eth0 -w /hostlab/ipv6_r1.pcap &
    6. r2: tcpdump -i eth0 -w /hostlab/ipv6_r2.pcap &
  4. No pc1 use o seguinte comando para adicionar o endereço IPv6 à interface de rede:

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

  1. No pc1 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. Configure os IPv6s de todas as interfaces dos demais equipamentos de acordo com o diagrama da rede.
  2. Faça um ping6 entre o pc3 ao pc4. Por exemplo do pc3 ao pc4:

ping6 2001:bcc:1f0:1::104 </syntaxhighlight>

  1. Obteve sucesso? Sim ou não e por quê?
  2. Faça um ping6 entre o pc1 ao pc2.
  3. Obteve sucesso? Sim ou não e por quê?
  4. Nos computadores pc3 e pc4, acrescente o default gateway com o seguinte comando:

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

  1. Nos computadores pc1 e pc2, acrescente o default gateway analisando o diagrama da rede e adaptando o comando acima.
  2. Configure os roteadores para habilitar o repasse de pacotes entre as interfaces utilizando os seguintes comandos:
    1. r1: echo 1 > /proc/sys/net/ipv6/conf/eth0/forwarding
    2. r1: echo 1 > /proc/sys/net/ipv6/conf/eth1/forwarding
    3. r1: echo 1 > /proc/sys/net/ipv6/conf/eth2/forwarding
    4. r2: echo 1 > /proc/sys/net/ipv6/conf/eth0/forwarding
    5. r2: echo 1 > /proc/sys/net/ipv6/conf/eth1/forwarding
  3. 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. Use os comandos traceroute6 numero_ipv6_pcX a partir do computador pc1 sobre o IP de global unicast dos computadores pc3 e pc4.
  2. Anote as rotas.
  3. Use o comando ip -6 route show para consultar a tabela de roteamento de cada um dos roteadores. São coerentes com os dados das rotas obtidas acima?
  4. Em cada um dos computadores virtuais, use o comando fg tcpdump para trazer o tcpdump para o primeiro plano. Em seguida encerre a captura com Ctrl + C.
  5. Estude os .pcaps gerados no wireshark: abra o wireshark, File/Open e procure os arquivo na pasta /home/aluno/lab. Clique sobre cada um deles e faça a análise.
  6. Verifique as diferenças dos cabeçalhos de um pacote IPv4 e de um pacote Ipv6, comparando capturas do wireshark.
  7. A partir das capturas obtidas, explique o processo de descoberta de vizinhança (neighbor discovery / request e reply), citando os endereços de multicast e link local utilizados.
  8. Explique a tabela de roteamento do r1, em especial os endereços de link local. Porque não há confusão dos prefixos? Explique também o uso dos prefixos diferentes para os pc1 e pc2. Por que não foi utilizado o mesmo prefixo?
  9. É possível utilizar os comandos route e ifconfig para configurar redes IPv6? Pesquise rapidamente no google e tente realizar a configuração do pc4 utilizando estes comandos. Para isso, use o comando ip addr flush dev eth0 no pc4 para limpar toda a configuração de endereços e rotas da interface. Depois disso configure o endereço com ifconfig e as rotas com o comando route.
  10. Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.

Softwares

  • Netkit2: possibilita criar experimentos com redes compostas por máquinas virtuais Linux

Curiosidades

Seminários

  • Objetivos:
    • Aprofundamento teórico em algum tema atual e relevante
    • Confecção de um relatório de trabalho no estilo científico
    • Apresentação de um trabalho científico

Recomenda-se a confecção do relatório na própria Wiki. O professor criará a página para cada projeto que assim o desejar. Na página do projeto, os membros da equipe podem editar a qualquer hora, sem preocupação com a versão do mesmo. Também facilita o acompanhamento por parte do professor. Utilizando ou não a Wiki, usem esse modelo de relatório.

  • Ordem de apresentação dos seminários
    • 17/06 - Ad-Hoc Network, HTTPS, SNMP
    • 23/6 - HTML5, Qos, VPN
    • 24/6 - HTTP2
  • Instruções sobre o Seminário de Redes I:
    • Data para definição de grupos e temas: 10/3/15.
    • 2 alunos por equipe.
    • Os temas devem ser propostos pelas equipes em comum acordo com o professor ou então na data limite o professor apresenta alguns temas e as equipes escolhem.
    • Data de entrega do documento: 2/6/15 (impreterivelmente).
    • O relatório pode ser redigido como uma página da wiki.
    • Duração da apresentação: 20 minutos + 5 minutos de perguntas.
    • As apresentações podem ser realizadas seguindo o conteúdo do relatório (use bastante figuras no relatório, isto facilita a apresentação).
    • Se preferirem usar slides, usem esse modelo.

Diário de aulas

Aula 1 - 4/2/15: Apresentação da disciplina
  • Apresentação da disciplina, plano de aula, trabalhos e métodos de avaliação.
  1. Auto apresentação
  2. Apresentação da Wiki
  3. Ementa
  4. Plano de Ensino
  5. Apresentação do modelo de aulas a ser adotado
    1. Laboratórios
    2. Bibliografia
  6. Avaliações
  7. Relação com outras disciplinas do curso
  8. Qual o grande objetivo das redes de computadores?
Aula 2 - 10/2/15: Introdução às redes de computadores

Slides do Kurose referentes ao capítulo 1

Aula 3 - 11/2/15: Introdução às redes de computadores

Slides do Kurose referentes ao capítulo 1

Aula 4 - 11/2/15: Introdução às redes de computadores

Slides do Kurose referentes ao capítulo 1

Aula 5 - 24/2/15: Introdução às redes de computadores

Slides do Kurose referentes ao capítulo 1

Aula 6 - 25/2/15: Introdução às redes de computadores

Slides do Kurose referentes ao capítulo 1

Aula 7 - 3/3/15: Introdução às redes de computadores

Slides do Kurose referentes ao capítulo 1

Aula 8 - 4/3/15: Laboratório 1 - Ping Traceroute Wireshark

Aplicativos para verificar os parâmetros do TCP/IP, diagnosticar o atraso dos pacotes, traçar rotas em redes TCP/IP e se familiarizar com o WireShark

Aula 9 - 10/3/15: Camada de aplicação - Comunicação entre processos HTTP

Slides do Kurose referentes ao capítulo 2

Aula 10 - 11/3/15: Camada de aplicação - HTTP FTP SMTP

Slides do Kurose referentes ao capítulo 2

Aula 11 - 17/3/15: Laboratório 2 - HTTP

Laboratório 2

Aula 12 - 18/3/15: Camada de aplicação - DNS

Slides do Kurose referentes ao capítulo 2

Slides do Prof. Emerson - DNS

Aula 13 - 24/3/15: Laboratório 3 - DNS

Laboratório 3

25/3/15: Não houve aulas - licença médica
Aula 14 - 31/3/15: Camada de aplicação - P2P - Finalização Laboratório DNS

Slides do Kurose referentes ao capítulo 2

Aula 15 - 1/4/15: Dúvidas
Aula 16 - 7/4/15: Avaliação 1
Aula 17 - 8/4/15: Introdução a camada de transporte - Multiplexação/Demultiplexação - UDP

Slides do Kurose referentes ao capítulo 3

Aula 18 - 14/4/15: Laboratório Sockets
Aula 19 - 15/4/15: TCP

Slides do Kurose referentes ao capítulo 3

Aula 20 - 22/4/15: Controle de congestionamento -- TCP

Slides do Kurose referentes ao capítulo 3

Aula 21 - 28/4/15: Laboratório: TCP versus UDP

Laboratório 5

Aula 22 - 29/4/15: A camada de rede - Redes de datagramas, circuitos virtuais e roteadores

Slides do Kurose referentes ao capítulo 4

Aula 23 - 5/5/15: A camada de rede - IP

Slides do Kurose referentes ao capítulo 4

Aula 24 - 6/5/15: A camada de rede

Slides do Kurose referentes ao capítulo 4

Aula 25 - 12/5/15: Dúvidas
Aula 26 - 12/5/15: Avaliação 2

Sala 13

Aula 27 - 18/5/15: Protocolos de roteamento

Slides do Kurose referentes ao capítulo 4

Aula 28 - 19/5/15: Protocolos de roteamento

Slides do Kurose referentes ao capítulo 4

Aula 29 - 26/5/15: Laboratório: Protocolos de roteamento

Laboratório 6

Aula 30 - 27/5/15: Laboratório: Protocolos de roteamento (cont.)

Laboratório 6

Aula 31 - 2/6/15: Laboratório: IPv6

Laboratório 7

Aula 32 - 3/6/15: Introdução à camada de enlace

Slides do Kurose referentes ao capítulo 5

Aula 33 - 9/6/15: Introdução à camada de enlace

Slides do Kurose referentes ao capítulo 5

Aula 34 - 10/6/15: Dúvidas para a terceira avaliação e sorteio de ordem de apresentação dos seminários
Aula 35 - 16/6/15: Terceira avaliação
Aula 36 - 17/6/15: Apresentação dos seminários
Aula 37 - 23/6/15: Apresentação dos seminários
Aula 38 - 24/6/15: Apresentação dos seminários
Aula 39 - 30/6/15: Reavaliação final